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 查詢