我的索引中包含以下数据。
{
"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视为分开的密钥。
答案 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"
}
}
}