gpt4 book ai didi

elasticsearch - 使用RestHighLevelClient在具有多个值的同一字段上查询

转载 作者:行者123 更新时间:2023-12-03 02:25:33 28 4
gpt4 key购买 nike

我必须使用Elasticsearch RestHighLevelClient来过滤/查询“URL”字段上的多个URL。
我形成了如下查询,但它给出了0条记录。

query.must(QueryBuilders.queryStringQuery("http://localhost:8080/test/*")
.field("url")
.lenient(true)
.escape(true)
.analyzeWildcard(true)
.fuzziness(Fuzziness.ZERO)
.defaultOperator(Operator.AND)
.boost(1.0f));
query.must(QueryBuilders.queryStringQuery("http://www.bbc.com/*")
.field("url")
.lenient(true)
.escape(true)
.analyzeWildcard(true)
.fuzziness(Fuzziness.ZERO)
.defaultOperator(Operator.AND)
.boost(1.0f));

如果我更改为以下内容,它将仅给我匹配的记录url http://localhost:8080/test/*,因为我将 Operator.AND设置为此,并将url http://www.bbc.com/*的查询设置为 Operator.OR
query.must(QueryBuilders.queryStringQuery("http://localhost:8080/test/*")
.field("url")
.lenient(true)
.escape(true)
.analyzeWildcard(true)
.fuzziness(Fuzziness.ZERO)
.defaultOperator(Operator.AND)
.boost(1.0f));
query.must(QueryBuilders.queryStringQuery("http://www.bbc.com/*")
.field("url")
.lenient(true)
.escape(true)
.analyzeWildcard(true)
.fuzziness(Fuzziness.ZERO)
.defaultOperator(Operator.OR)
.boost(1.0f));

因此,它忽略了 http://www.bbc.com/*过滤器。

我在这里做错什么吗?如何在同一字段上写多个查询?

最佳答案

您应该在 should 查询中使用must而不是bool

原始查询会怎样?

您执行的第一个查询实际上要求文档中同时存在这两个url值:当且仅当在同一文档中您具有url: http://localhost:8080/test/url: http://www.bbc.com/时,它才会匹配。

对于 bool 查询,此行为是正常现象,并非特定于我假设您正在使用的 BoolQueryBuilder

如何对两个查询进行逻辑或?

实际上,您应该使用 BoolQueryBuilder.should() 将这两个查询置于逻辑或中:

query.should(QueryBuilders.queryStringQuery("http://localhost:8080/test/*")
.field("url")
.lenient(true)
.escape(true)
.analyzeWildcard(true)
.fuzziness(Fuzziness.ZERO)
.defaultOperator(Operator.AND)
.boost(1.0f));
query.should(QueryBuilders.queryStringQuery("http://www.bbc.com/*")
.field("url")
.lenient(true)
.escape(true)
.analyzeWildcard(true)
.fuzziness(Fuzziness.ZERO)
.defaultOperator(Operator.AND)
.boost(1.0f));

如何将其与查询的其他部分结合起来?

正如您在评论中指出的那样,您的查询实际上更加复杂:查询必须与其中一种URL模式匹配,并且如果它们也与内容匹配,则应提高结果。

为了实现这一点,您应该使用两个嵌套的 bool(boolean) 查询,如下所示:
BoolQueryBuilder urlQuery = BoolQueryBuilder();

urlQuery.should(QueryBuilders.queryStringQuery("http://localhost:8080/test/*")
.field("url")
.lenient(true)
.escape(true)
.analyzeWildcard(true)
.fuzziness(Fuzziness.ZERO)
.defaultOperator(Operator.AND)
.boost(1.0f));

urlQuery.should(QueryBuilders.queryStringQuery("http://www.bbc.com/*")
.field("url")
.lenient(true)
.escape(true)
.analyzeWildcard(true)
.fuzziness(Fuzziness.ZERO)
.defaultOperator(Operator.AND)
.boost(1.0f));

WildcardQueryBuilder wildcardQuery = QueryBuilderswildcardQuery("content", "anyt*");


// here `query` is your original bool query
query.must(urlQuery);
query.should(wildcardQuery);

Elasticsearch会将这个查询解释为:

fetch documents that must match either url query #1 or url query #2, and rank higher those that match wildcardQuery


defaultOperator与这一切有什么关系?
.defaultOperator(Operator.OR)实际上只是试图让您感到困惑的Elasticsearch:与在逻辑OR中组合两个查询无关,而只是 query string query的参数:

default_operator

(Optional, string) Default boolean logic used to interpret text in the query string if no operators are specified.



该参数实际上告诉您传递的 queryStringQuery()中的Elasticsearch how to interpret the tokens。您可以将字符串查询视为 Lucene query language中的查询。

希望有帮助!

关于elasticsearch - 使用RestHighLevelClient在具有多个值的同一字段上查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61221578/

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