【问题标题】:Elastic Search Group by field弹性搜索按字段分组
【发布时间】:2020-11-08 12:12:52
【问题描述】:

我的索引中有以下数据。

{
"id":1,
"car_name" : "ABC-101"
},
{
"id":2,
"car_name" : "DEF-102"
},
{
"id":3,
"car_name" : "ABC-103"
}

我的索引的映射是

{
  "car": {
    "mappings": {
      "_doc": {
        "properties": {
          "car_name": {
            "type": "text",
            "fielddata": true
          }
        }
      }
    }
  } 
}

我运行以下查询

 localhost:9200/car/_doc/_search?pretty

带有以下请求正文

{
"size" : 0,
"aggs" : {
    "genres" : {
        "terms" : { 
            "field" : "car_name"
        }
    }
}

}

我收到以下回复

"buckets": [
    {
      "key": "ABC",
      "doc_count": 2
    },
    {
      "key": "DEF",
      "doc_count": 1
    },
    {
      "key": "101",
      "doc_count": 1
    },
    {
      "key": "102",
      "doc_count": 1
    },
    {
      "key": "103",
      "doc_count": 1
    }
]

为什么不带实际的键 ABC-101 和 DEF-102 为什么 ABC 和 101 被视为分开的键。

【问题讨论】:

标签: elasticsearch elasticsearch-aggregation


【解决方案1】:

默认情况下,elasticasearch 中的字符串字段为analyzed。代表着 “ABC-101” 被索引为 2 个术语 “ABC”“101”。您的 查询也被分析,它也被转换成两个词“ABC”和“101” 无论它们之间有哪些特殊字符。

这就是为什么它们匹配所有由- 分隔的字符串,例如 ABC、101、DEF、102 等等。

例如

  {
  "car": {
    "car_name": "string",
    "fields": {
      "raw": {
        "type": "string",
        "index": "not_analyzed"
      }
    }
  }  
  }

如果您想按原样搜索该字段,则应将其重新索引为"index":"not_analyzed"

您可以使其与 car_name 字段上的 keyword 一起使用以完全匹配

{
  "size" : 0,
  "aggs" : {
      "genres" : {
          "terms" : { 
              "field" : "car_name.keyword"
          }
      }
  }

【讨论】:

  • 使用keyword 类型是当前的最佳实践,not_analyzed string 已成为过去。
  • 我最终使用了“关键字”类型,现在我得到了我想要的结果。我不知道为什么当我使用“文本”字段时,我无法在聚合中使用“field.keyword”。
  • 因为您的映射中没有 keyword 子字段。
猜你喜欢
  • 2013-04-15
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多