2014-09-10 3 views
0

Je rencontre des difficultés pour créer une requête qui doit rechercher des documents avec un terme de recherche donné dans les champs titre et texte, et doit correspondre à un champ d'état qui peut être égal à zéro ou plus où au moins on doit correspondre.La requête Elasticsearch ne produit pas le résultat attendu

Compte tenu de la requête suivante:

"bool" : { 
    "must" : { 
     "multi_match" : { 
     "query" : "test", 
     "fields" : [ "title", "text" ] 
     } 
    }, 
    "should" : { 
     "terms" : { 
     "state" : [ "NEW" ] 
     } 
    }, 
    "minimum_should_match" : "1" 
    } 

ne devrait pas les données suivantes retourner en conséquence?

{ 
    "_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 
} 

Dans mon test, ce n'est pas le cas. Qu'est-ce que je fais mal? Ce qui suit est le code java qui produit la requête sortie.

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

Toute aide à ce sujet est grandement appréciée!

Répondre

0

Semble que j'ai trouvé le problème, pour une raison quelconque, je ne pouvais pas aller chercher en utilisant l'enum de filtre dans sa forme originale. J'ai dû convertir l'enum en chaîne et en minuscules.

J'ai ensuite ajouté la requête suivante

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

Je suis nouveau à ElasticSearch, donc je ne sais pas si cela est un bug ou une fonction. Je suis content d'avoir compris.

Questions connexes