我在 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 OR myfield2”匹配的结果,但我需要获得与“myfield1 AND”匹配的所有结果myfield2”
例如,如果我有 2 个文档,其中一个带有
myfield1 =“Foo”和 myfield2 =“测试”
另一个是:
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 逻辑,那么您可以排除 should
。您需要 must
来代替,并且可能使用 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())
应该会导致错误,因为您无法将 bool 查询序列化为 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
}
}
}
关于Java Elastic Search 查询给出错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58266719/