繁体   English   中英

Elasticsearch Java 高级 Rest 客户端构造具有多个匹配值和 OR2DA 查询的 Z84E2C64F38F78BA27EA5C905ZA 查询

[英]Elasticsearch Java High Level Rest Client constructing a boolean query with multiple match values and OR condition

我正在尝试通过 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 条件是错误的。

布尔查询中的过滤器而不是必须匹配产生相同的结果。 感谢帮助。

match -Queries 中的OR -Operator 意味着该特定子查询的每个查询字符串中只有一个术语必须与文档匹配才能使子查询匹配,因此这不是您的目标。 要使用OR复合子查询,您必须在根布尔查询中使用should而不是must mustAND运算符的 ElasticSearch 等效项,而should表示OR

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM