zoukankan      html  css  js  c++  java
  • 记录解决 Elasticseach 过滤与聚合问题

    一、问题描述

    最近在项目中遇到了一个场景需要用 es 聚合处理,但是在实现的过程中结果发现了设置的条件过滤却不起了作用,导致聚合出来的结果有不准确,随后查阅资料了解了原因及其解决方法,遂将解决步骤记录

    二、原因及解决

    在查看代码时发现了自己的条件过滤条件放在了 NativeSearchQueryBuilder#withFilter() 中,而这里的 withFilter 在 DSL 语句中为:

    GET 索引名/_seach
    {
      "query":{
      	 "match_all": {
          	"boost": 1
        }
      },
      "post_filter": {
        
      }
    }
    

    而 **post_filter **意义为后置过滤,适用于聚合后进行条件筛选等后置处理。在此场景下,正确的是应该将查询条件筛选等放入NativeSearchQueryBuilder#withQuery() 中,再利用 bool 组装条件,故正确 DSL 语句为:

    GET 索引名/_search
    {
      "query":{
        "bool":{
        	must:[],
            filter:[]
        }
      }
    }
    

    这里提一句,filter 会比 **must **效率高,因为 **filter **会有缓存而 **must **则没有,但 must scorefilter则没有,具体用哪种还得看使用场景

    三、收获

    在这次坑之后,发现自己对 ES 及其 DSL 还是一知半解,学习的路还很长,看来是个持续踩坑过程

  • 相关阅读:
    (转载)李开复:我在硅谷看到的最前沿科技趋势
    1019. 数字黑洞 (20)
    1018. 锤子剪刀布 (20)
    1017. A除以B (20)
    1016. 部分A+B (15)
    1015. 德才论 (25)
    1013. 数素数 (20)
    1014. 福尔摩斯的约会 (20)
    1012. 数字分类 (20)
    1011. A+B和C (15)
  • 原文地址:https://www.cnblogs.com/z-coding/p/14832863.html
Copyright © 2011-2022 走看看