弹性搜索按字段分组

Elastic Search Group by field

我的索引中有以下数据。

{
"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
          }
        }
      }
    }
  } 
}

Whey 运行 下面的查询

 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 被视为单独的键。

默认情况下,字符串字段在 elasticasearch 中是 analyzed。代表着 "ABC-101" 被索引为 2 个术语 "ABC""101"。您的 query 也被 analyzed,并且它也被转换成 2 个术语“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"
          }
      }
  }