随笔 - 394  文章 - 0  评论 - 946  阅读 - 143万 

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   程序诗人  阅读(989)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示