Elastic Search 中keyword-倒排索引

 2024-07-31    0 条评论    23076 浏览

es

在Elasticsearch中,keyword类型会生成索引,并且生成的索引结构与文本字段(text类型)有所不同。keyword类型用于索引不需要分词的精确值,如标识符、电子邮件地址、标签、状态等。

keyword类型的索引生成

索引结构

对于keyword类型字段,Elasticsearch会为每个唯一值生成倒排索引。这种倒排索引结构允许对这些字段进行高效的精确匹配查询。

假设我们有以下文档集合:

[
  { "username": "alice" },
  { "username": "bob" },
  { "username": "alice" },
  { "username": "charlie" }
]

对于keyword类型的username字段,生成的倒排索引结构如下:

  • 词典(Dictionary):包含所有唯一的关键词
    • ["alice", "bob", "charlie"]
  • 倒排表(Posting List):对于每个关键词,存储包含该关键词的文档ID列表
    • "alice" → [1, 3]
    • "bob" → [2]
    • "charlie" → [4]

映射示例

定义一个索引并设置username字段为keyword类型:

PUT /my_index
{
  "mappings": {
    "properties": {
      "username": {
        "type": "keyword"
      }
    }
  }
}

插入一些文档:

POST /my_index/_doc/1
{
  "username": "alice"
}

POST /my_index/_doc/2
{
  "username": "bob"
}

POST /my_index/_doc/3
{
  "username": "alice"
}

POST /my_index/_doc/4
{
  "username": "charlie"
}

查询示例

精确匹配查询

由于keyword类型字段支持精确匹配,可以使用term查询来查找特定关键词:

GET /my_index/_search
{
  "query": {
    "term": {
      "username": "alice"
    }
  }
}

这个查询会返回所有username字段值为alice的文档。

聚合查询

keyword类型字段也非常适合进行聚合操作,如统计不同用户名的数量:

GET /my_index/_search
{
  "size": 0,
  "aggs": {
    "username_count": {
      "terms": {
        "field": "username"
      }
    }
  }
}

这个查询会返回每个用户名的出现次数:

{
  "aggregations": {
    "username_count": {
      "buckets": [
        { "key": "alice", "doc_count": 2 },
        { "key": "bob", "doc_count": 1 },
        { "key": "charlie", "doc_count": 1 }
      ]
    }
  }
}

结论

  • 索引生成keyword类型字段会生成倒排索引,与text类型字段的索引结构类似,但不会进行分词。
  • 索引结构:包含词典和倒排表,词典存储所有唯一的关键词,倒排表存储包含每个关键词的文档ID列表。
  • 适用场景:适用于需要精确匹配和聚合操作的字段,如标识符、标签、状态等。

通过了解keyword类型的索引结构和使用方法,可以更好地设计和优化Elasticsearch索引,以满足具体的搜索和分析需求。