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