gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:39:15 25 4
gpt4 key购买 nike

我无法理解 Elasticsearch 中 Bool 过滤器和 And 过滤器之间的区别。

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

每个字段可以有多个值。

目标:

我想在以下意义上向 Elasticsearch 发送查询:(X=valueX1 OR X=valueX2) AND (Y=valueY1 OR Y=valueY2 OR ..) AND (Z=valueZ1 OR Z=valueZ2 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") );

问题:

  • 我的方法正确吗?
  • Bool 过滤器和 And 过滤器有什么区别?

最佳答案

主要区别在于它们的执行方式。而这里的关键字是bitset。简而言之,bool 过滤器利用位集,而 过滤器则没有。

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

当使用 过滤器时,ES 只是简单地逐一扫描文档列表,并根据它是否匹配过滤器来包含或不包含它。

不用说,bool 过滤器比 and 过滤器要快得多。然而,并非总是如此。在某些情况下,您仍然希望使用 and 而不是 bool:当使用地理过滤器、脚本过滤器和数字范围过滤器时,即当使用这些过滤器时,ES 必须迭代无论如何,在所有文档上。

然而,所有这些只适用于 ES pre-2.0,如 starting in 2.0 , and/or 过滤器将实现为 bool 并且查询 DSL 将被彻底检查,这样就不会再有任何区别了在查询和过滤器之间。

如需更深入的信息,您可以阅读这篇标题为:"All about ES filter bitsets" 的精彩博文中的细节细节。

所以你所做的没问题,但更简洁的替代方法是简单地 must 三个 terms 过滤器,如下所示:

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"));

关于java - Elastic Search 中的 And filter 和 Bool filter 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32140667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com