【问题标题】:Elasticsearch index sharding explanationElasticsearch 索引分片解释
【发布时间】:2018-04-10 17:30:21
【问题描述】:

我试图弄清楚弹性搜索索引的概念,但完全不明白。我想提前说明几点。我了解逆向文档索引的工作原理(将术语映射到文档 ID),我也了解基于 TF-IDF 的文档排名是如何工作的。我不明白的是实际索引的数据结构。在引用弹性搜索文档时,它将索引描述为“具有到文档的映射的表”。所以,分片来了!!当您查看弹性搜索索引的典型图片时,它是这样表示的: 图片没有显示的是实际分区是如何发生的,以及这个 [table -> document] 链接是如何跨多个分片拆分的。例如,每个分片是否垂直拆分表?这意味着倒排索引表仅包含分片上存在的术语。例如,假设我们有 3 个分片,这意味着第一个分片将包含 document1,第二个分片仅包含文档 2,第三个分片是文档 3。现在,第一个分片索引是否只包含 document1 中存在的术语?在这种情况下[蓝色,明亮,蝴蝶,微风,悬挂]。如果是这样,如果有人搜索 [忘记],弹性搜索如何“知道”不在分片 1 中搜索,或者每次都搜索所有分片? 当您查看集群图像时:

目前尚不清楚 shard1、shard2 和 shard3 中究竟是什么。我们从 Term -> DocumentId -> Document 转到一个“矩形”分片,但分片究竟包含什么?

如果有人能从上面的图片中解释一下,我将不胜感激。

【问题讨论】:

    标签: elasticsearch lucene full-text-search full-text-indexing


    【解决方案1】:

    理论

    Elastichsarch 建立在 Lucene 之上。每个分片只是一个 Lucene 索引。 Lucene 索引,如果简化的话,就是倒排索引。每个 Elasticsearch 索引都是一堆分片或 Lucene 索引。当您查询文档时,Elasticsearch 将子查询所有分片、合并结果并将其返回给您。当您将文档索引到 Elasticsearch 时,Elasticsearch 将使用公式计算应写入哪个分片文档

    shard = hash(routing) % number_of_primary_shards
    

    默认情况下,Elasticsearch 使用文档id 作为路由。如果您指定routing 参数,它将被使用而不是id。您可以在搜索查询和索引、删除或更新文档的请求中使用routing 参数。 默认作为哈希函数使用MurmurHash3

    示例

    使用 3 个分片创建索引

    $ curl -XPUT localhost:9200/so -d '
    { 
        "settings" : { 
            "index" : { 
                "number_of_shards" : 3, 
                "number_of_replicas" : 0 
            } 
        } 
    }'
    

    索引文件

    $ curl -XPUT localhost:9200/so/question/1 -d '
    { 
        "number" : 47011047, 
        "title" : "need elasticsearch index sharding explanation" 
    }'
    

    无路由查询

    $ curl "localhost:9200/so/question/_search?&pretty"

    响应

    查看_shards.total - 这是被查询的分片数量。另请注意,我们找到了文档

    {
      "took" : 1,
      "timed_out" : false,
      "_shards" : {
        "total" : 3,
        "successful" : 3,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 1,
        "max_score" : 1.0,
        "hits" : [
          {
            "_index" : "so",
            "_type" : "question",
            "_id" : "1",
            "_score" : 1.0,
            "_source" : {
              "number" : 47011047,
              "title" : "need elasticsearch index sharding explanation"
            }
          }
        ]
      }
    }
    

    使用正确的路由查询

    $ curl "localhost:9200/so/question/_search?explain=true&routing=1&pretty"

    响应

    _shards.total 现在是 1,因为我们指定了路由,elasticsearch 知道要向哪个分片请求文档。使用参数explain=true 我要求elasticsearch 给我有关查询的更多信息。注意hits._shard - 它设置为[so][2]。这意味着我们的文档存储在so索引的第二个分片中。

    {
      "took" : 2,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 1,
        "max_score" : 1.0,
        "hits" : [
          {
            "_shard" : "[so][2]",
            "_node" : "2skA6yiPSVOInMX0ZsD91Q",
            "_index" : "so",
            "_type" : "question",
            "_id" : "1",
            "_score" : 1.0,
            "_source" : {
              "number" : 47011047,
              "title" : "need elasticsearch index sharding explanation"
            },
            ...
    }
    

    路由不正确的查询

    $ curl "localhost:9200/so/question/_search?explain=true&routing=2&pretty"

    响应

    _shards.total 再次 1. 但是 Elasticsearch 没有向我们的查询返回任何内容,因为我们指定了错误的路由并且 Elasticsearch 查询了没有文档的分片。

    {
      "took" : 1,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "failed" : 0
      },
      "hits" : {
        "total" : 0,
        "max_score" : null,
        "hits" : [ ]
      }
    }
    

    其他信息

    【讨论】:

    • 感谢 Nikita 的详细回答,但我认为它并没有真正解决这个问题。我了解 Lucene 索引的工作原理、倒排索引的工作原理以及文档如何根据文档 ID 路由到分片。我无法掌握的是作为倒排索引表/术语的一部分存储的内容(看图片)。请参考原始问题:第一个分片索引是否仅包含 document1 中存在的术语?在这种情况下[蓝色,明亮,蝴蝶,微风,垂悬]。
    • @AlexPryiomka 简而言之 - 第一个分片索引将仅包含在分析路由给他的文档后获得的术语。 Elasticsearch 将整个工作委托给 Lucene。如果 document1 被路由到分片 1,那么分片 1 将包含 document1 的术语。如果 document1 未路由到 shard1,则 shard1 将不包含 document1 的术语。每个分片都是一个单独的 Lucene 索引。 Elasticsearch 仅用作聚合器。我更新了示例 - 尝试执行它们并更仔细地阅读答案
    • 倒排索引不是 Elasticsearch 的一部分,它是 Lucene 的一部分
    猜你喜欢
    • 1970-01-01
    • 2016-07-28
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2019-04-12
    • 2020-01-17
    • 1970-01-01
    相关资源
    最近更新 更多