Java弹性搜索查询给出错误的结果
我对Java中的elasticsearch查询有一个问题 这是我的代码: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
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和myfield2”匹配的结果
例如,如果我有两个文档,一个带有
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
}
}
}