2017-04-13 5 views
1

Exemple:Puis-je effectuer une recherche sur plusieurs champs à l'aide de l'API Java Elastic Search?

|studentname | maths | computers | 
++++++++++++++++++++++++++++++++++ 
|s1   |78  |90   | 
================================== 
|s2   |56  |75   | 
================================== 
|s3   |45  |50   | 
================================== 

Le tableau ci-dessus représente des données qui est présente dans ElasticSearch.

Tenir compte que l'utilisateur entre 60 and above alors ElasticSearch devrait être en mesure d'afficher uniquement s1, parce qu'il est le seul étudiant qui a marqué plus de 60 dans les deux sujets. Comment le résoudre en utilisant Java API?

NOTE: J'ai pu trouver des sujets individuels par:

QueryBuilder query = QueryBuilders.boolQuery() 
      .should(
        QueryBuilders.rangeQuery(maths) 
        .from(50) 
        .to(100) 
      ) 
+0

Vous avez d'abord mal compris. Mise à jour ma réponse –

Répondre

4

Vous pouvez avoir plusieurs clauses .should() dans la requête de la bool. Donc, dans votre cas:

QueryBuilder query = QueryBuilders.boolQuery() 
     .should(
       QueryBuilders.rangeQuery(maths) 
       .from(61) 
       .to(100) 
     ) 
     .should(
       QueryBuilders.rangeQuery(computers) 
       .from(61) 
       .to(100) 
     ) 

Note:

  1. RangeQueryBuilder (retour de QueryBuilders.rangeQuery()) a aussi la méthode #gte(). Selon les docs: "Dans une requête booléenne sans clauses must ou filter, une ou plusieurs clauses doivent correspondre à un document." Donc, si vous n'avez pas filter ou must, vous pourriez ne pas obtenir le comportement désiré. La réponse ci-dessus suppose que vous utilisez d'autres clauses. Le point est que vous pouvez combiner des clauses dans la requête bool. Avec l'API Java, cela signifie simplement utiliser la clause à plusieurs reprises.

  2. Vous pouvez utiliser un filtre au lieu de devoir. Cela entraînera une exécution et une mise en cache plus rapides (https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html)

+1

merci beaucoup, monsieur. Cela m'a vraiment aidé :) –

+1

Excellent :)! Notez que si vous n'avez pas besoin de vos résultats, vous pouvez utiliser 'filter' au lieu de' should'. Cela entraînera une exécution et une mise en cache plus rapides (https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html) –

+0

ne devrait-il pas correspondre à student2 ('s2') comme il a des scores dans les ordinateurs au-dessus de 60. – avr