1. 程式人生 > >ElasticSearch 複合查詢 java入門的一個坑

ElasticSearch 複合查詢 java入門的一個坑

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 原理還沒有找到,如果有哪位大佬知道,還請不吝賜教,謝謝!