簡體   English   中英

如何將文檔索引到特定的 ElasticSearch 分片?

[英]How to index a document to a specific ElasticSearch shard?

我想將文檔索引到特定的 ElasticSearch 分片。

我知道我可以配置 ES 來查看一個字段,並根據該字段將其發送到特定的分片。

我不想那樣做。 我只想說: 1) 好吧,我決定本周將所有文檔導入 Shard 1,因為我喜歡。

我知道有一種方法可以將查詢發送到特定的分片,但是導入呢?

我怎樣才能做到這一點?

如果你想完全控制分片,你應該使用多個索引和單個分片,而不是單個索引和多個分片。 通過這種方式,您將能夠決定數據將轉到哪個索引(和分片,因為每個索引只有一個分片)。 您還可以創建一個別名,將所有此類索引合並為一個別名,這樣您就不必擔心在搜索過程中列出所有索引。

從性能的角度來看,搜索具有 10 個分片的單個索引和搜索具有單個分片的 10 個索引之間的區別很小。 在這兩種情況下,您都將搜索 10 個分片。 在這種情況下,您應該擔心的一件事是保持映射兼容。 您可能不希望一個字段在一個索引中被索引為字符串,而在另一個索引中被索引為整數。

我確定您已經解決了您的問題或找到了其他解決方案,但我在項目中遇到了類似的問題,我想發布我們為將文檔索引到特定分片所做的工作。

您可以通過 Elasticsearch 的_routing字段通過使用 Elasticsearch 給定的公式計算分片數來實現這一點:

shard_num = hash(_routing) % num_primary_shards

假設您想將一個文檔分配給分片編號 2,並且當分片編號為 10 時,當模數取自其散列和分片編號時,您必須給出路由名稱。 為此,您必須找到一個路由名稱,在代碼中進行解釋,我將在 Java 中給出一個示例,以查找具有特定路由名稱的分片號:

 for (int i = 0; i < 5; i++) {
    String routing = "tenant"+i;
    final int numberOfShard = 30;
    final int shard = routing.hashCode() % numberOfShard;
    System.out.println("Routing: " + routing + " - shard number: " + shard);
}

輸出:

Routing: tenant0 - shard number: -2
Routing: tenant1 - shard number: -1
Routing: tenant2 - shard number: 0
Routing: tenant3 - shard number: -29
Routing: tenant4 - shard number: -28

您必須生成一個字符串,對其散列值和分片數進行模數,以引導您想要的分片編號。 從上面的輸出中, tenant0路由名稱通向分片shard number 2

作為一個完整的例子,我想用一個路由名稱來演示索引:

假設我們創建“ course ”索引並設置所需的路由:

PUT http://localhost:9200/course
{
    "settings": {
        "number_of_shards": 30
    },
    "mappings": {
        "_routing": {
           "required": true 
        }
    }
}

然后你像這樣索引一個文檔:

PUT http://localhost:9200/course_index/_doc/1?routing=tenant0&refresh=true
{
    "id": 1,
    "title": "Data Security course in Lidl",
    "description": "The course teaches our core Data Security measurements here in Lidle. As new regulations are out, ....",
    "text": "Text of the couse goes here",
    "created_date": 152625632,
    "last_date": 152625632,
    "expiration_date": null,
    "domain_id": 10,
    "language_id": 2
}

在我們的例子中,我們有一個多租戶軟件,其中大約 100 個租戶(組織)在 Elasticsearch 中共享相同的索引,我們必須確保數據安全,一個租戶永遠無法看到其他租戶的數據。 我們使用 100 個分片為所有租戶創建索引並通過為每個租戶查找路由名稱為每個租戶專用一個分片的解決方案。 正如您在上面的索引映射示例中看到的,路由設置為“required”,每當您向 Elasticsearch 發送 CRUD 操作時,您必須定義一個路由,否則 Elasticsearch 將拋出routing_missing_exception

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM