ES中match_phrase_prefix查詢返回爲空

ES查詢利用的是matchPhrasePrefixQuery,在查詢日誌的時候,發現輸入關鍵字:2021-03-08 16,可以查詢出來一些數據,但是如果輸入關鍵字:2021-03-08 1則無法查詢出來任何日誌。

後來經過調研發現,爲了保證良好的性能, es的match_phrase_prefix查詢,默認的max_expansions是50。
由於匹配是逆向的,所以當你輸入 mytest L的時候,由於日誌中L很多,他會將前50項含有L的日誌,添加到自己的結果集中,然後再匹配mytest, 但是由於這50項日誌中,不一定會有mytest,所以日誌返回爲空; 但是爲啥輸入mytest LR就有日誌了呢, 因爲LR比較精確,他也是找前50項含有LR的日誌,添加到結果集,然後再匹配mytest。 
這裏我做的改動,就是將max_expansions調整到了最大,Integer.MAX_VALUE,這也是爲啥結果能出來了:QueryBuilders.matchPhrasePrefixQuery("msg", queryParam.getKeyword().trim()).maxExpansions(Integer.MAX_VALUE)

個人認爲, 查不到,不是bug,而是es的優化,因爲他期待你查詢的時候,儘量用精確的查詢來找到結果,而模糊的查詢,由於性能問題,他會給你屏蔽掉

 

參考:

https://stackoverflow.com/questions/47182126/elasticsearch-match-phrase-prefix-not-matching-all-terms

https://stackoverflow.com/questions/25485441/elastic-search-match-phrase-prefix-not-able-to-find-all-records

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章