我无法理解弹性搜索中的 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") );
问题:
与其在这里使用布尔过滤器,不如使用多匹配查询。由于您将一个变量“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
主要区别在于它们是如何执行的。这里的关键词是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配置文件? 问题答案: 声明一般注释,比如支持,等等。 声明了注