Java Elastic Search查询给出错误结果

MassimoB:

我在Java中使用elasticsearch查询时遇到问题,这是我的代码:

BoolQueryBuilder qb = QueryBuilders.boolQuery();

for example:
if (myFilter.getTerm1() != null) {
        qb.should(QueryBuilders.termsQuery("myfield1", myFilter.getTerm1()));
    }

if (myFilter.getTerm2() != null) {
        qb.should(QueryBuilders.termsQuery("myfield2", myFilter.getTerm2()));
    }

qb.minimumShouldMatch("100%");
SearchRequest request = op.searchRequest(classTarget(MyClass.class));// this just create a new SearchRequest    
sourceBuilder.query(QueryBuilders.simpleQueryStringQuery(qb.toString()));
    sourceBuilder.from((pageNumber));
    sourceBuilder.size(pageSize);
    request.source(sourceBuilder);

问题是,这给了我所有与“ myfield1 myfield2” 匹配的结果,但是我需要具有与“ myfield1 AND myfield2” 匹配的所有结果

例如,如果我有2个文档,其中一个

myfield1 =“ Foo”和myfield2 =“ Test”

另一个具有:

myfield1 =“弹性”,myfield2 =“搜索”

如果我用myfield1 =“ Foo”和myfield2 =“ Search”进行查询,我希望没有结果,但是我有两个文档。

我还尝试使用“必须”代替“应该”,并且尝试在sourceBuilder中将默认运算符设置为“ AND”,但是在这种情况下,即使查询应该返回某些内容,我也没有任何结果。

这是“请求”的打印

Query request: SearchRequest{searchType=QUERY_THEN_FETCH, indices=[myIndex], indicesOptions=IndicesOptions[ignore_unavailable=false, allow_no_indices=true, expand_wildcards_open=true, expand_wildcards_closed=false, allow_aliases_to_multiple_indices=true, forbid_closed_indices=true, ignore_aliases=false], types=[data], routing='null', preference='data', requestCache=null, scroll=null, maxConcurrentShardRequests=0, batchedReduceSize=512, preFilterShardSize=128, allowPartialSearchResults=null, source={"from":0,"size":100,"query":{"simple_query_string":{"query":"{\n  \"bool\" : {\n    \"should\" : [\n      {\n        \"terms\" : {\n          \"myfield1.keyword\" : [\n            \"foo\"\n          ],\n          \"boost\" : 1.0\n        }\n      },\n      {\n        \"terms\" : {\n          \"myfield2.keyword\" : [\n            \"search\"\n          ],\n          \"boost\" : 1.0\n        }\n      }\n    ],\n    \"adjust_pure_negative\" : true,\n    \"minimum_should_match\" : \"100%\",\n    \"boost\" : 1.0\n  }\n}","flags":-1,"default_operator":"or","analyze_wildcard":false,"auto_generate_synonyms_phrase_query":true,"fuzzy_prefix_length":0,"fuzzy_max_expansions":50,"fuzzy_transpositions":true,"boost":1.0}}}}
值:

如果您需要AND逻辑,则可以排除shouldmust可能需要match查询,而不是查询term(因为我认为您不需要完全匹配)。尝试以下方法:

if (myFilter.getTerm1() != null) {
    qb.must(QueryBuilders.matchQuery("myfield1", myFilter.getTerm1()));
}

if (myFilter.getTerm2() != null) {
    qb.must(QueryBuilders.matchQuery("myfield2", myFilter.getTerm2()));
}

也删除 qb.minimumShouldMatch("100%");

同样,这QueryBuilders.simpleQueryStringQuery(qb.toString())也将导致错误,因为您无法将布尔查询序列化为simple_query_string查询,但这并不意味着要这样做。

只需将您的声明更改为此:

sourceBuilder.query(qb);

如果您打印出查询,您将看到以下内容,这很可能不是您想要的:

{
  "from": 0,
  "size": 100,
  "query": {
    "simple_query_string": {
      "query": "{\n  \"bool\" : {\n    \"should\" : [\n      {\n        \"terms\" : {\n          \"myfield1.keyword\" : [\n            \"foo\"\n          ],\n          \"boost\" : 1.0\n        }\n      },\n      {\n        \"terms\" : {\n          \"myfield2.keyword\" : [\n            \"search\"\n          ],\n          \"boost\" : 1.0\n        }\n      }\n    ],\n    \"adjust_pure_negative\" : true,\n    \"minimum_should_match\" : \"100%\",\n    \"boost\" : 1.0\n  }\n}",
      "flags": -1,
      "default_operator": "or",
      "analyze_wildcard": false,
      "auto_generate_synonyms_phrase_query": true,
      "fuzzy_prefix_length": 0,
      "fuzzy_max_expansions": 50,
      "fuzzy_transpositions": true,
      "boost": 1
    }
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章