filter 查询不计算相关性,同时可以 cache ,因此 filter 速度要快于 query.
POST /lib4/items/_bulk
{"index":{"_id":1}}
{"price":40,"itemID":"ID100123"}
{"index":{"_id":2}}
{"price":50,"itemID":"ID100124"}
{"index":{"_id":3}}
{"price":25,"itemID":"ID100124"}
{"index":{"_id":4}}
{"price":30,"itemID":"ID100125"}
{"index":{"_id":5}}
{"price":null,"itemID":"ID100127"}
// 过滤价格从 25,到 40 的 文档
GET /lib4/items/_search
{
"query":{
"bool":{
"filter":[
{"terms":{"price":[25,40] }}
]
}
}
}
// 查找 itemID 为 ID100023 的文档
GET /lib4/items/_search
{
"query":{
"bool":{
"filter":[
{"term":{"itemID":"ID100123"}}
]
}
}
}
// 返回的记录中查找不到该文档
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 0,
"max_score" : null,
"hits" : [ ]
}
}
原因是在使用 _bluk 动态创建mapping是 将 itemID 自动识别为 text 类型。所以在存储的时候讲 itemID 的数据中的大写在分词的时候进行了小写处理。
GET /lib4/items/_mapping
解决方法:
①:在查找的时候使用小写。
②:使用 match 查询