ElasticSearch-倒排索引

 2022-07-19    0 条评论    24166 浏览

es

有倒排索引的概念,就有正排索引的概念。

倒排索引(Inverted Index)和正排索引(Forward Index)是两种不同的索引结构,分别用于不同的检索需求。

倒排索引(Inverted Index)

概念

倒排索引是一种将词项(Term)映射到包含这些词项的文档列表的数据结构。它是全文搜索引擎(如Elasticsearch)的核心,用于快速查找包含特定词项的文档。

工作原理

  1. 词典(Dictionary):包含所有唯一的词项。
  2. 倒排表(Posting List):对于每个词项,存储包含该词项的文档ID列表以及词项在文档中的位置(可选)。

示例

假设有以下三个文档:

  • Doc1: "Elasticsearch is a search engine"
  • Doc2: "Elasticsearch uses inverted index"
  • Doc3: "Search engines use inverted indexes"

倒排索引会如下构建:

  • 词典(Dictionary):["elasticsearch", "is", "a", "search", "engine", "uses", "inverted", "index", "engines", "use", "indexes"]
  • 倒排表(Posting List):
    • "elasticsearch" → [Doc1, Doc2]
    • "is" → [Doc1]
    • "a" → [Doc1]
    • "search" → [Doc1, Doc3]
    • "engine" → [Doc1]
    • "uses" → [Doc2]
    • "inverted" → [Doc2, Doc3]
    • "index" → [Doc2]
    • "engines" → [Doc3]
    • "use" → [Doc3]
    • "indexes" → [Doc3]

优点

  • 快速查询:通过词项查找文档,查询速度快。
  • 节省存储:只存储词项和文档ID,而不是整个文档内容。
  • 支持复杂查询:布尔查询、短语查询、模糊查询等。

缺点

  • 更新复杂:增加或删除文档时,需要更新索引。
  • 初始构建耗时:构建倒排索引时需要对所有文档进行分词和处理。

正排索引(Forward Index)

概念

正排索引是一种将文档ID或某个唯一,映射到文档内容或元数据的数据结构。它适用于需要快速定位某个文档的场景。

工作原理

  1. 文档列表:包含所有文档的列表。
  2. 文档内容:每个文档ID对应一个完整的文档内容或元数据记录。

示例

假设有以下三个文档:

  • Doc1: "Elasticsearch is a search engine"
  • Doc2: "Elasticsearch uses inverted index"
  • Doc3: "Search engines use inverted indexes"

正排索引会如下构建:

  • 文档列表:
    • Doc1 → "Elasticsearch is a search engine"
    • Doc2 → "Elasticsearch uses inverted index"
    • Doc3 → "Search engines use inverted indexes"

优点

  • 快速访问:可以快速获取文档内容或元数据。
  • 更新简单:增加或删除文档时,只需要更新文档列表,不需要重新构建索引。

缺点

  • 查询效率低:通过词项查找文档效率低,需要遍历所有文档。
  • 存储占用大:存储所有文档内容,存储需求大。

总结

特性倒排索引正排索引
主要用途全文搜索快速访问文档内容或元数据
数据结构词典和倒排表文档列表
优点快速查询、节省存储、支持复杂查询快速访问文档内容、更新简单
缺点更新复杂、初始构建耗时查询效率低、存储占用大

倒排索引适用于需要高效全文搜索和复杂查询的场景,如搜索引擎;正排索引适用于需要快速访问和检索文档内容的场景,如文档管理系统。了解这两种索引的概念和特点,有助于在实际应用中选择合适的索引结构。

Elastic search中的倒排索引

在Elasticsearch中,索引的生成与数据类型有关。不同的数据类型有不同的索引策略,一些类型会生成倒排索引以支持搜索,而另一些类型则不会。下面详细介绍Elasticsearch中常见的数据类型及其索引行为。

会生成倒排索引的数据类型

  1. text 类型

    • 用途:用于全文搜索。
    • 索引行为:对文本进行分词和分析,然后为每个词项生成倒排索引。
    • 示例
      PUT /my_index
      {
        "mappings": {
          "properties": {
            "description": {
              "type": "text"
            }
          }
        }
      }
      
  2. keyword 类型

    • 用途:用于精确匹配搜索。
    • 索引行为:为每个关键词生成倒排索引,不进行分词。
    • 示例
      PUT /my_index
      {
        "mappings": {
          "properties": {
            "status": {
              "type": "keyword"
            }
          }
        }
      }
      
  3. date 类型

    • 用途:用于存储日期和时间。
    • 索引行为:为日期值生成倒排索引,支持范围查询和精确匹配。
    • 示例
      PUT /my_index
      {
        "mappings": {
          "properties": {
            "created_at": {
              "type": "date"
            }
          }
        }
      }
      
  4. numeric 类型

    • 包含long, integer, short, byte, double, float, half_float, scaled_float
    • 用途:用于存储数值。
    • 索引行为:为数值生成倒排索引,支持范围查询和精确匹配。
    • 示例
      PUT /my_index
      {
        "mappings": {
          "properties": {
            "price": {
              "type": "double"
            }
          }
        }
      }
      
  5. boolean 类型

    • 用途:用于存储布尔值(true/false)。
    • 索引行为:为布尔值生成倒排索引,支持精确匹配。
    • 示例
      PUT /my_index
      {
        "mappings": {
          "properties": {
            "is_active": {
              "type": "boolean"
            }
          }
        }
      }
      

6.IP类型

不会生成倒排索引的数据类型

  1. binary 类型

    • 用途:用于存储二进制数据(如文件内容、图像)。
    • 索引行为:不生成倒排索引,无法进行搜索。
    • 示例
      PUT /my_index
      {
        "mappings": {
          "properties": {
            "file_data": {
              "type": "binary"
            }
          }
        }
      }
      
  2. object 类型

    • 用途:用于存储JSON对象。
    • 索引行为:不直接生成倒排索引,但对象内部的可索引字段会生成倒排索引。
    • 示例
      PUT /my_index
      {
        "mappings": {
          "properties": {
            "address": {
              "type": "object",
              "properties": {
                "city": {
                  "type": "keyword"
                },
                "zipcode": {
                  "type": "integer"
                }
              }
            }
          }
        }
      }
      
  3. nested 类型

    • 用途:用于存储嵌套的JSON对象。
    • 索引行为:类似于object类型,但以独立的文档存储和索引,内部可索引字段会生成倒排索引。
    • 示例
      PUT /my_index
      {
        "mappings": {
          "properties": {
            "comments": {
              "type": "nested",
              "properties": {
                "author": {
                  "type": "keyword"
                },
                "message": {
                  "type": "text"
                }
              }
            }
          }
        }
      }
      
  4. geo_pointgeo_shape 类型

    • 用途:用于存储地理位置和形状数据。
    • 索引行为:不生成倒排索引,但会生成专用的地理索引以支持地理位置查询。
    • 示例
      PUT /my_index
      {
        "mappings": {
          "properties": {
            "location": {
              "type": "geo_point"
            }
          }
        }
      }
      

总结

  • 生成倒排索引的数据类型text, keyword, date, numeric, boolean
  • 不生成倒排索引的数据类型binary, object, nested, geo_point, geo_shape

了解哪些数据类型会生成倒排索引以及它们的索引行为,有助于优化Elasticsearch索引设计,提高搜索性能和准确性。