ElasticSearch 複合查詢 java入門的一個坑
阿新 • • 發佈:2019-01-27
ElasticSearch should/must查詢
本人剛接觸ES兩個月,公司最近要用到商品的全文搜尋,剛好對於我這個剛接觸es是個挑戰。
可能有大佬認為這是個小兒科,當然,這只是個人認為入門需要注意的小坑,如果覺得哪裡寫的不好,謝謝指出,我會盡力修改完善!
should查詢和must查詢聯合使用會導致搜尋結果範圍擴大
程式碼塊
舉個例子,有個需求:電商需要根據輸入的關鍵詞搜尋商品,
1.要求能用空格分詞功能,
2.支援多條件篩選:使用者勾選多品牌、多個類目、多種國家的商品條件,能篩選出這些條件下的商品
3.頁面給使用者檢視的商品均為可售賣商品 (saleStates=xxxx)
查詢關鍵詞為 mobile 例如:
{
"size": 12,
"query": {
"bool": {
"should": [
{
"query_string": {
"query": "mobile"
}
}
],
"must": [
{
"match": {
"saleStates": {
"query": "xxxx"
}
}
}
],
"disable_coord": false,
"adjust_pure_negative": true,
"boost": 1
}
},
"sort": [
{
"updateTime": {
"order": "desc"
}
}
]
}
上句可以看出,must條件用於多條件篩選,包括多品牌等,還要可售狀態的商品;should條件用於全文關鍵詞搜尋,根據更新時間進行倒序排序,分頁查詢每頁顯示12條。搜尋結果是2917條命中。查看了下,居然是可售狀態下所有商品都被展示出來了!明顯這不符合關鍵詞”mobile”的條件。接下來把should條件放入must裡進行查詢
{
"size": 12,
"query": {
"bool": {
"must": [
{
"match": {
"saleStates": {
"query": "N000100100"
}
}
},
{
"query_string": {
"query": "mobile"
}
}
],
"disable_coord": false,
"adjust_pure_negative": true,
"boost": 1
}
},
"_source": {
"includes": [],
"excludes": []
},
"sort": [
{
"updateTime": {
"order": "desc"
}
}
]
}
此時的查詢結果來看是39條!大大提高了搜尋準確率。目前為止,只是發現了這樣做的區別和搜尋結果不準確產生的原因。should/must 原理還沒有找到,如果有哪位大佬知道,還請不吝賜教,謝謝!