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

posted on 2021-03-09 16:58  程序诗人  阅读(128)  评论(0编辑  收藏  举报