【问题标题】:Elasticsearch query doesn't produce expected resultElasticsearch 查询不会产生预期的结果
【发布时间】:2014-09-10 12:37:31
【问题描述】:

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

给定以下查询:

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

非常感谢您对此的任何帮助!

【问题讨论】:

    标签: java search elasticsearch


    【解决方案1】:

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

    然后我添加了以下查询

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

    我是 elasticsearch 新手,所以我不知道这是错误还是功能。我很高兴我弄明白了。

    【讨论】:

      猜你喜欢
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多