弹性搜索按字段分组

时间:2019-10-07 08:11:24

标签: elasticsearch elasticsearch-aggregation

我的索引中包含以下数据。

{
"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视为分开的密钥。

1 个答案:

答案 0 :(得分:1)

默认情况下,elasticasearch中的字符串字段为analyzed。这意味着 “ ABC-101” 被索引为2个术语“ ABC” “ 101” 。您的 查询也会进行分析,并且还转换为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"
          }
      }
  }