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

时间:2013-11-02 03:12:33

标签: lucene elasticsearch

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

我知道我可以配置ES来查看字段,并根据该字段将其发送到特定的分片。

我不想那样做。我只是想说: 1)好的,我决定本周将所有文件导入Shard 1,因为我觉得这样。

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

我该怎么做?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

我确定您已经解决了问题或找到了另一个解决方案,但是我在项目中遇到了类似的问题,我想发表一下我们为将文档索引到特定分片所做的事情。

您可以通过Elasticsearch的{​​{1}}字段通过使用Elasticsearch给定的formula计算一个分片号来实现此目的:

_routing

比方说,您想将文档分配给分片编号2,并且当从其哈希和分片编号中获取模数时,当分片编号为10时,必须提供路由名称。为此,您必须找到一个路由名称,以在代码中进行解释,我将在Java中给出一个示例,以查找具有特定路由名称的分片号:

shard_num = hash(_routing) % num_primary_shards

输出:

 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

然后您为这样的文档编制索引:

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

在我们的案例中,我们有一个多租户软件,其中约100个租户(组织)在Elasticsearch中共享相同的索引,并且我们必须确保数据安全性,使一个租户永远不会看到其他租户的数据。我们提出的解决方案是为所有具有100个分片的租户创建索引,并通过为每个租户查找路由名称为每个租户分配一个分片。如您在上面的索引映射示例中看到的那样,路由设置为“ required”,并且每当您将CRUD操作发送到Elasticsearch时,都必须定义一个路由,否则Elasticsearch会抛出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 }