2017-04-13 11 views
1

例:Elastic Search Java APIを使用して複数のフィールドで検索できますか?

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

上記の表は、Elasticsearchに存在するデータを表します。

は、ユーザーが60 and above彼は両方の科目で60以上を獲得した唯一の学生であるため、その後Elasticsearchは、唯一S1を表示することができるはずが入ることを考えてみましょう。

Java APIを使用してどのように解決できますか?

注:ブールクエリで複数の.should()句を持つことができます

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

最初はあなたが間違っていました。私の答えを更新しました。 –

答えて

4

:私がして、個々の被験者のために見つけることができました。だからあなたの場合:

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

注:(QueryBuilders.rangeQuery()から返される)

  1. RangeQueryBuilderも方法#gte()を持っています。

  2. ドキュメントによれば、「mustまたはfilter句を持たないブール型クエリでは、1つ以上のshould節がドキュメントに一致する必要があります。したがって、filterまたはmustがない場合、目的の動作を得られない可能性があります。上記の答えはあなたが他のいくつかの節を使用していることを前提としています。 boolクエリで句を組み合わせることができます。 Java APIでは、この節を繰り返し使用するだけです。

  3. フィルタではなく、フィルタを使用すると便利です。これにより、より速い実行とキャッシュにつながります(https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

+1

ありがとうございます。それは本当に私を助けた:) –

+1

優秀:)!結果が得点になる必要がない場合は、 'should'の代わりに' filter'を使いたいかもしれません。これにより、より速い実行とキャッシング(https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html) –

+0

がstudent2( 's2')と一致しないようにします。 )彼は60歳以上のコンピュータでスコアを得ているからだ。 – avr

関連する問題