2014-09-10 62 views
0

我在创建一个查询时遇到问题,该查询应该在字段标题和文本中搜索具有特定搜索项的任何文档,并且应匹配可能为零个或多个值的状态字段至少有一个必须匹配。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(); 

对此非常感谢!

回答

0

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

我加入下面的查询

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

我是新来elasticsearch,所以我不知道这是不是一个错误,或者特征。我很高兴我明白了。