当前位置: 首页 > 知识库问答 >
问题:

Elastic Search中的And filter和Bool filter有什么区别?

居星阑
2023-03-14

我无法理解弹性搜索中的 Bool 筛选器和 And 筛选器之间的区别。

上下文:假设我的文档具有字段:X、Y、Z。

每个字段可以有多个值。

目标:

我想在以下意义上向弹性搜索发送一个查询:(X=value eX1 OR X=value eX2)AND(Y=value eY1 OR Y=value eY2 OR…)AND(Z=value eZ1 OR Z=value eZ2 OR……)

尝试:

我是这样做的:

BoolFilterBuilder mainClaus = FilterBuilders.boolFilter();
FilterBuilder filterBuilder = mainClaus;

BoolFilterBuilder xClaus = FilterBuilders.boolFilter();
BoolFilterBuilder yClaus = FilterBuilders.boolFilter();
BoolFilterBuilder zClaus = FilterBuilders.boolFilter();

mainClaus.must(xClaus);
mainClaus.must(yClaus);
mainClaus.must(zClaus);

//Return a document if it has at least one of those values.
xClaus.should( FilterBuilders.termFilter("X", "valueX1") );
xClaus.should( FilterBuilders.termFilter("X", "valueX2") );
xClaus.should( FilterBuilders.termFilter("X", "valueX3") );

//Return a document if it has at least one of those values.
yClaus.should( FilterBuilders.termFilter("Y", "valueY1") );
yClaus.should( FilterBuilders.termFilter("Y", "valueY2") );
yClaus.should( FilterBuilders.termFilter("Y", "valueY3") );

//Return a document if it has at least one of those values.
zClaus.should( FilterBuilders.termFilter("Z", "valueZ1") );
zClaus.should( FilterBuilders.termFilter("Z", "valueZ2") );
zClaus.should( FilterBuilders.termFilter("Z", "valueZ3") );

问题:

  • 我的方法正确吗?
  • 布尔筛选器和 And 筛选器之间有什么区别?

共有2个答案

楚涵润
2023-03-14

与其在这里使用布尔过滤器,不如使用多匹配查询。由于您将一个变量“X”与三个不同的值进行比较,下面的代码将是更好的方法。

String [] params = {'valueX1','valueX3','valueX3'}

queryBuilder =  QueryBuilders.multiMatchQuery('X', params);

然后可以将此queryBuilder添加为更大的“必须”查询的一部分,其中可以比较所有三个变量X、Y和Z。

您可以在此处阅读有关多匹配查询的更多信息。https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html

郑狐若
2023-03-14

主要区别在于它们是如何执行的。这里的关键词是bitset。简单地说,< code>bool过滤器利用位集,而< code >和过滤器不利用。

使用bool过滤器时,会创建位集,然后将其与/或组合在一起,以找出匹配的文档。

当使用<code>和</code>过滤器时,ES只需逐个扫描文档列表,并根据它是否与过滤器匹配而将其包含在内。

不用说,<code>bool</code>过滤器比<code>和</code>过滤器更快。然而,并非总是如此。在某些情况下,您仍然希望使用<code>和</code>而不是<code>bool</code>:当使用地理过滤器、脚本过滤器和数值范围过滤器时,即当使用这些过滤器时,ES必须遍历所有文档。

然而,所有这些只适用于ES 2.0之前的版本,因为从2.0开始,< code >和/过滤器将被实现为< code>bool,查询DSL将被彻底检查,因此查询和过滤器之间不再有任何区别。

有关更多深入的信息,您可以在这篇标题为“关于 ES 滤波器位集的所有信息”的精彩博客文章中阅读细节。

所以你所做的是可以的,但是一个更简洁的替代方案是简单地必须三个术语过滤器,如下所示:

BoolFilterBuilder mainClaus = FilterBuilders.boolFilter();
mainClaus.must(FilterBuilders.termsFilter("X", "valueX1", "valueX2", "valueX3"));
mainClaus.must(FilterBuilders.termsFilter("Y", "valueY1", "valueY2", "valueY3"));
mainClaus.must(FilterBuilders.termsFilter("Z", "valueZ1", "valueZ2", "valueZ3"));
 类似资料:
  • 问题内容: 我知道ElasticSearch是基于Apache Lucene构建的,但是我想知道两者之间的显着差异。 问题答案: Lucene是一个 Java库 。您可以将其包含在项目中,并使用函数调用来引用其功能。 Elasticsearch是一个 JSON 基于, 分布式 , 网络服务器 建在Lucene的。尽管是Lucene在做下面的实际工作,但是Elasticsearch为我们提供了一个在

  • 问题内容: 拥有所有领域的两者之间的区别使我难以理解。 如果我的文件有: 我知道这是一个包含所有字段的字段。但是呢?这是否意味着“名称”被保存了几次(在中和两次),从而增加了文档占用的磁盘空间? 一次存储的领域,曾经为“名” ,并一次?关于“数字”,什么是它存储在,即使没有? 什么时候应该在查询中使用? 我可以禁用的用例是什么,然后将拒绝使用什么功能? 问题答案: 它与lucene中的索引字段和存

  • 问题内容: 我是elasticsearch的新手,在must和filter之间感到困惑。我想在条款之间执行and操作,所以我这样做了 开机自检/ xyz / _search 这给了我所需的结果,既匹配了术语,又使用了像这样的过滤器 开机自检/ xyz / _search 我得到相同的结果,所以什么时候应该使用must以及什么时候应该使用filter?有什么区别? 问题答案: 有助于得分。在中,查询

  • 发布/xyz/_search 我得到了相同的结果,那么什么时候应该使用must和什么时候应该使用filter呢?有什么区别?

  • 我目前正试图理解字段之间的差异(https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html)和属性(https://www.elastic.co/guide/en/elasticsearch/reference/current/properties.html). 它们都以某种方式定义为类型/映射

  • 问题内容: 我一直认为Java 中的运算符用于验证其两个布尔操作数是否均为,并且该&运算符用于对两种整数类型进行按位运算。 最近我知道,也可以使用运算符来验证其两个布尔操作数是否均为,唯一的区别是即使LHS操作数为false,它也会检查RHS操作数。 Java中的运算符是否在内部重载?还是在这背后有其他概念? 问题答案: <-验证两个操作数 <-停止评估第一个操作数是否为false,因为结果为fa

  • 问题内容: JavaScript中的&和&&有什么区别? 示例代码: 似乎&&是一个逻辑上的“和”,如果两个都为true,则总是为我提供第二个值。 但是什么是&? (顺便说一下,&&在Python中似乎是“ and”;&在Python中似乎是&。) 问题答案: 是按位AND 该运算符期望 两个数字 并重新调整一个 数字。 如果它们不是数字,则将其强制转换为数字。 注意: 在Javascript中,

  • 问题内容: 我正在从Spring 2.5迁移到Spring 3。 他们介绍了一些黑魔法。预期仅在servlet配置文件中声明。 在Spring 2.5中,我刚刚使用,并且在分发服务器servlet配置XML中声明了标记,并使用了要扫描的基本包。 所以,我不知道是什么样的区别,并在servlet配置标签和我有什么可以消除在Spring3配置文件? 问题答案: 声明一般注释,比如支持,等等。 声明了注