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