elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

Java弹性搜索查询给出错误的结果

Java弹性搜索查询给出错误的结果,java,elasticsearch,Java,elasticsearch,我对Java中的elasticsearch查询有一个问题 这是我的代码: BoolQueryBuilder qb = QueryBuilders.boolQuery(); for example: if (myFilter.getTerm1() != null) { qb.should(QueryBuilders.termsQuery("myfield1", myFilter.getTerm1())); } if (myFilter.getTerm2() != nul

我对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);
问题是,这会返回与“myfield1myfield2”匹配的所有结果,但我需要所有与“myfield1myfield2”匹配的结果

例如,如果我有两个文档,一个带有

myfield1=“Foo”和myfield2=“Test”

另一个是:

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

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

我还尝试使用“must”而不是“should”,并尝试在sourceBuilder中将默认运算符设置为“and”,但在这种情况下,如果查询应该返回某些内容,则根本没有结果

这是“请求”的打印


如果您需要和逻辑,那么可以排除
应该
。您需要
必须
,可能需要使用
匹配
查询而不是
术语
(因为我认为您不需要精确匹配)。请尝试以下方法:

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

if (myFilter.getTerm2() != null) {
    qb.must(QueryBuilders.matchQuery("myfield2", myFilter.getTerm2()));
}
同时删除
qb。最小值应匹配(“100%”)

此外,这个
QueryBuilders.simpleQueryStringQuery(qb.toString())
应该会导致一个错误,因为您无法将bool查询序列化为
simple\u query\u 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
    }
  }
}

将所有“应该”更改为“必须”,将所有“术语查询”更改为“匹配查询”。此外,qb最小值应匹配(“100%”);删除。相同的reusltsCan您显示了一个应该匹配的文档,您的索引映射以及您在查询中发送的查询词?我不认为这与文档或映射有关,因为以前我没有使用Sourcebuilder,而且它工作正常,但后来我需要它来设置Sourcebuilder.from(pageNumber);sourceBuilder.size(页面大小);用于分页。因此,我认为这与Sourcebuilder有关。顺便说一句,谢谢您的回复。在本例中,您发送的
pageNumber
pageSize
是什么?另一个问题是:
QueryBuilders.simpleQueryStringQuery(qb.toString())
您无法将布尔查询序列化为
SimpleQueryString
,它就是不起作用。。。顺便说一下,这会给你一个错误。
{
  "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
    }
  }
}