zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【OpenCv/EmguCv】指针式仪表读数(二)
    合天网安实验室CTF练习赛之RE300
    Codeforces Round #527 -A. Uniform String(思维)
    CodeForces
    CodeForces
    CodeForces
    CodeForces
    CodeForces
    CodeForces
    CodeForces
  • 原文地址:https://www.cnblogs.com/scy251147/p/14506596.html
Copyright © 2011-2022 走看看