作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过 java 高级 Rest 客户端构造一个查询,该客户端实现获取 id 列表并返回与给定 id 匹配的所有文档,类似于带有 OR 运算符的 WHERE 子句。
出于这个原因,我一直在使用 bool 查询,并尝试迭代列表,并且必须使用设置为 OR 的运算符来匹配每个值
BoolQueryBuilder builder = QueryBuilders.boolQuery();
ids.forEach(i -> {
bool.must(QueryBuilders.matchQuery("_id", i).operator(Operator.OR));
});
return bool;
//这样构造 dsl
{
"bool" : {
"must" : [
{
"match" : {
"_id" : {
"query" : "0025370c-baea-4dcc-af48-56c4bdb86854",
"operator" : "OR",
"prefix_length" : 0,
"max_expansions" : 50,
"fuzzy_transpositions" : true,
"lenient" : false,
"zero_terms_query" : "NONE",
"auto_generate_synonyms_phrase_query" : true,
"boost" : 1.0
}
}
},
{
"match" : {
"_id" : {
"query" : "013fedef-6b04-4520-8458-fca8b0366833",
"operator" : "OR",
"prefix_length" : 0,
"max_expansions" : 50,
"fuzzy_transpositions" : true,
"lenient" : false,
"zero_terms_query" : "NONE",
"auto_generate_synonyms_phrase_query" : true,
"boost" : 1.0
}
}
},
{
"match" : {
"_id" : {
"query" : "01c44ce4-0e87-4dc9-8a29-1f24679d335f",
"operator" : "OR",
"prefix_length" : 0,
"max_expansions" : 50,
"fuzzy_transpositions" : true,
"lenient" : false,
"zero_terms_query" : "NONE",
"auto_generate_synonyms_phrase_query" : true,
"boost" : 1.0
}
}
}
],
"adjust_pure_negative" : true,
"boost" : 1.0
}
}
它构造得很好,只是它不起作用,因为我认为 OR 嵌套得很低,并且不会应用于多个匹配。所以我认为需要有一个嵌套类型,我尝试了这个:
BoolQueryBuilder bool = QueryBuilders.boolQuery();
BoolQueryBuilder subBool = QueryBuilders.boolQuery();
ids.forEach(i -> {
subBool.must(QueryBuilders.matchQuery("_id", i).operator(Operator.OR));
});
bool.must(subBool);
return bool;
//对我来说,将运算符条件放在 bool 而不是 subBool 上更有意义,但它不可用,我确信我会做错
{
"bool" : {
"must" : [
{
"bool" : {
"must" : [
{
"match" : {
"_id" : {
"query" : "0025370c-baea-4dcc-af48-56c4bdb86854",
"operator" : "OR",
"prefix_length" : 0,
"max_expansions" : 50,
"fuzzy_transpositions" : true,
"lenient" : false,
"zero_terms_query" : "NONE",
"auto_generate_synonyms_phrase_query" : true,
"boost" : 1.0
}
}
},
{
"match" : {
"_id" : {
"query" : "013fedef-6b04-4520-8458-fca8b0366833",
"operator" : "OR",
"prefix_length" : 0,
"max_expansions" : 50,
"fuzzy_transpositions" : true,
"lenient" : false,
"zero_terms_query" : "NONE",
"auto_generate_synonyms_phrase_query" : true,
"boost" : 1.0
}
}
},
{
"match" : {
"_id" : {
"query" : "01c44ce4-0e87-4dc9-8a29-1f24679d335f",
"operator" : "OR",
"prefix_length" : 0,
"max_expansions" : 50,
"fuzzy_transpositions" : true,
"lenient" : false,
"zero_terms_query" : "NONE",
"auto_generate_synonyms_phrase_query" : true,
"boost" : 1.0
}
}
}
],
"adjust_pure_negative" : true,
"boost" : 1.0
}
}
],
"adjust_pure_negative" : true,
"boost" : 1.0
}
}
如果我在嵌套匹配中将其减少为单个值(再次是 1 个 id 而不是很多),这似乎会起作用...所以我仍然认为我错误地实现了 OR 条件。
boolean 查询中的过滤器而不是必须匹配会产生相同的结果。感谢您的帮助。
最佳答案
match
查询中的 OR
运算符意味着该特定子查询的每个查询字符串中只有一个术语必须与文档匹配,以便要匹配的子查询,所以这不是您的目标。要使用 OR
复合子查询,您必须在根 boolean 查询中使用 should
而不是 must
。 must
是 AND
运算符的 ElasticSearch 等效项,而 should
表示 OR
。
关于java - Elasticsearch Java High Level Rest Client 使用多个匹配值和 OR 条件构建 boolean 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58435763/
我是一名优秀的程序员,十分优秀!