2014-09-10 7 views
0

제목 및 텍스트 필드에 특정 검색어가 포함 된 문서를 검색하는 데 문제가 있으며 제로 이상의 값이 될 수있는 상태 필드와 일치해야합니다. 적어도 하나는 일치해야합니다.탄성 검색 쿼리가 예상 결과를 산출하지 않습니다.

"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

필자는이 문제를 발견 한 것 같습니다. 어떤 이유로 원본 양식에 필터 열거 형을 사용할 때 가져올 수 없습니다. 열거 형을 문자열로 변환하고 소문자로 변환해야했습니다.

나는 그때 elasticsearch에 새로 온 사람, 그래서 이것은 버그 또는 기능입니다 경우 모르겠어요 다음 쿼리

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

을 추가했다. 나는 그것을 알아 낸 것을 기쁘게 생각합니다.

관련 문제