elasticsearch,Lucene,elasticsearch" /> elasticsearch,Lucene,elasticsearch" />

Lucene 如何将文档索引到特定的ElasticSearch碎片?

Lucene 如何将文档索引到特定的ElasticSearch碎片?,lucene,elasticsearch,Lucene,elasticsearch,我想将文档索引到特定的ElasticSearch碎片 我知道我可以将ES配置为查看字段,并基于该字段将其发送到特定的切分 我不想那样做。我只想说: 1) 好的,我决定本周将所有文档导入Shard 1,因为我喜欢它 我知道有一种方法可以将查询发送到特定的碎片,但是导入呢 如何实现这一点?如果您想完全控制碎片,应该使用多个索引和单个碎片,而不是一个索引和多个碎片。通过这种方式,您将能够决定数据将转到哪个索引(以及切分,因为每个索引只有一个切分)。您还可以创建一个别名,将所有此类索引合并到一个别名中,

我想将文档索引到特定的ElasticSearch碎片

我知道我可以将ES配置为查看字段,并基于该字段将其发送到特定的切分

我不想那样做。我只想说: 1) 好的,我决定本周将所有文档导入Shard 1,因为我喜欢它

我知道有一种方法可以将查询发送到特定的碎片,但是导入呢


如何实现这一点?

如果您想完全控制碎片,应该使用多个索引和单个碎片,而不是一个索引和多个碎片。通过这种方式,您将能够决定数据将转到哪个索引(以及切分,因为每个索引只有一个切分)。您还可以创建一个别名,将所有此类索引合并到一个别名中,这样您就不必担心在搜索过程中列出所有索引


从性能的角度来看,用10个分片搜索单个索引和用每个分片搜索10个索引之间几乎没有什么区别。在这两种情况下,您将搜索10个碎片。在此场景中,您应该担心的一件事是保持映射的兼容性。您可能不希望字段在一个索引中作为字符串索引,在另一个索引中作为整数索引

我确信您已经解决了您的问题或找到了另一个解决方案,但我在项目中遇到了类似的问题,我想发布我们为将文档索引到特定碎片所做的工作

您可以通过Elasticsearch的路由字段来实现这一点,方法是使用Elasticsearch给出的值计算碎片数:

shard_num = hash(_routing) % num_primary_shards
假设您想将一个文档分配给shard number 2,当shard number为10时,您必须给出路由名称,当模数从其散列和shard数中提取时。为此,您必须找到一个路由名称,为了在代码中进行解释,我将给出一个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);
}
您必须生成一个字符串,该字符串的散列值和碎片数将引导您所需的碎片数。从上面的输出中,
tenant0
路由名称导致
碎片编号2

作为一个完整的示例,我想演示如何使用路由名称进行索引:

 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);
}
假设我们创建“课程”索引并设置所需的路线:

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个碎片,并通过为每个租户查找路由名称为每个租户指定一个碎片。正如您在上面的索引映射示例中所看到的,路由设置为“必需”,每当您向Elasticsearch发送CRUD操作时,必须定义路由,否则Elasticsearch将抛出
routing\u missing\u异常