Elasticsearch查询不会产生预期结果

时间:2014-09-10 12:37:31

标签: java search elasticsearch

我在创建查询时遇到问题,该查询应该在字段标题和文本中搜索具有特定搜索字词的任何文档,并且应该匹配状态字段,该字段可以是零或更多值,其中至少必须匹配。

给出以下查询:

  "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();

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

似乎我发现了这个问题,由于某些原因我在使用过滤器enum的原始形式时无法获取。我不得不将枚举转换为字符串并将其小写。

然后我添加了以下查询

boolQuery.must(QueryBuilders.termsQuery("state", getLowerCaseEnumCollection(filters)).minimumMatch(1));

我是弹性搜索的新手,所以我不知道这是一个错误还是一个功能。我很高兴我弄清楚了。