我在创建查询时遇到问题,该查询应该在字段标题和文本中搜索具有特定搜索字词的任何文档,并且应该匹配状态字段,该字段可以是零或更多值,其中至少必须匹配。
给出以下查询:
"bool" : {
"must" : {
"multi_match" : {
"query" : "test",
"fields" : [ "title", "text" ]
}
},
"should" : {
"terms" : {
"state" : [ "NEW" ]
}
},
"minimum_should_match" : "1"
}
结果不应该返回以下数据吗?
{
"_shards": {
"failed": 0,
"successful": 5,
"total": 5
},
"hits": {
"hits": [
{
"_id": "JXnEkYFDQp2feATMzp2LTA",
"_index": "tips",
"_score": 1.0,
"_source": {
"state": "NEW",
"text": "This is a test",
"title": "Test"
},
"_type": "tip"
}
],
"max_score": 1.0,
"total": 1
},
"timed_out": false,
"took": 1
}
在我的测试中,事实并非如此。我做错了什么?
以下是生成输出查询的java代码。
SearchRequestBuilder builder = client.prepareSearch("tips").setTypes("tip");
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
if(searchTermIsNotEmpty(searchTerm)){
MultiMatchQueryBuilder qb = QueryBuilders.multiMatchQuery(
searchTerm,
"title", "text"
);
boolQuery.must(qb);
}
if(filters.size() > 0){
boolQuery.should(QueryBuilders.termsQuery("state",filters));
boolQuery.minimumNumberShouldMatch(1);
}
if(boolQuery.hasClauses()){
builder.setQuery(boolQuery);
}
logger.info(boolQuery.toString());
SearchResponse result = builder.execute().actionGet();
return result.toString();
非常感谢任何帮助!
答案 0 :(得分:0)
似乎我发现了这个问题,由于某些原因我在使用过滤器enum的原始形式时无法获取。我不得不将枚举转换为字符串并将其小写。
然后我添加了以下查询
boolQuery.must(QueryBuilders.termsQuery("state", getLowerCaseEnumCollection(filters)).minimumMatch(1));
我是弹性搜索的新手,所以我不知道这是一个错误还是一个功能。我很高兴我弄清楚了。