2016-06-27 2 views
2

J'ai construit une application web au-dessus de elasticsearch. Je voudrais faire un filtre multiple en utilisant Java.Comment faire une requête de filtre multiple dans Elasticsearch en utilisant Java?

ElasticSearch Requête:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     {"match": { 
      "T": "TEXT"}, 
      "match": { 
      "new_content": "TEXT" 
      } 
     }, 

     ], 
     "filter": { 
     "term": { 
      "collection1": "xyz" 
     }, 
     "term": { 
      "collection2": "abc" 
     } 

Je veux filtrer la requête telle qu'elle doit filtrer sur le même champ collection avec deux valeurs différentes (par exemple, « xyz » et « abc »)

En ce moment, j'ai codé un programme Java pour le filtre unique.

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() 
       .must(QueryBuilders.simpleQueryStringQuery(query).field("newContent").field("T")) 
       .filter(QueryBuilders.termQuery(Collection1, "abc")); 

Comment filtrer une requête sur un même champ pour plusieurs valeurs?

Modifier:

En fait, dans mon application web, j'ai extrait la valeur de la collection comme:

String[] Collection=request.getParameterValues("site"); 

Collection est le domaine dans mes documents ElasticSearch. Supposons que Collection[0] est germany_collection (valeur: true), Collection[1] est usa_collection (valeur: true). Je veux écrire une requête qui filtre mes documents de manière à obtenir des résultats quand germany_collection: true et usa_collection: true.

Voici mon programme original:

public StringBuffer getJson(String query, String start, String [] Collection{ 
Client client = TransportClient.builder().build() 
       .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); 

     BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() 
       .must(QueryBuilders.simpleQueryStringQuery(query).field("newContent").field("T")) 
       .filter(QueryBuilders.termQuery(Collection[0], "true").filter(QueryBuilders.termQuery(Collection[1], "true"); 

Mais quand je n'appliqué ce filtre, je reçois cette erreur The method filter(TermsQueryBuilder) is undefined for the type TermsQueryBuilder. Il dit ajouter cast à reciever de la méthode.

Répondre

4

Vous pouvez utiliser la requête terms au lieu de plusieurs term requêtes:

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() 
       .must(QueryBuilders.simpleQueryStringQuery(query).field("newContent").field("T")) 
       .filter(QueryBuilders.termsQuery(Collection, "abc", "xyz")); 
             ^    ^ ^
              |     |  | 
            use termsQuery  with multiple values 

MISE À JOUR

Je suis surpris de votre code compile du tout parce que vous manquez une parenthèse fermante, juste rewrite votre requête comme ceci et cela devrait fonctionner:

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() 
      .must(QueryBuilders.simpleQueryStringQuery(query).field("newContent").field("T")) 
      .filter(QueryBuilders.termQuery(Collection[0], "true")) 
      .filter(QueryBuilders.termQuery(Collection[1], "true")); 
+0

Désolé. J'ai foiré en posant une bonne question. Pouvez-vous s'il vous plaît vérifier ma partie d'édition? – Rose

+0

J'ai mis à jour ma réponse. – Val

+0

Cela a fonctionné. Merci. Une erreur s'est produite à cause de la parenthèse fermante manquante. Merci encore – Rose