2017-04-13 39 views
1

实施例:我可以使用Elastic Search Java API在多个字段中进行搜索吗?

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

上表表示数据存在于Elasticsearch。

考虑到用户输入60 and above然后Elasticsearch应该能够只显示S1,因为他是谁已经打进了60多个在这两个问题唯一的学生。

如何使用Java API解决问题?

注:我能够找出个别科目:

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

起初误解了你。更新了我的答案。 –

回答

4

您可以在该布尔查询多个.should()条款。所以你的情况:

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

注:

  1. RangeQueryBuilder(从QueryBuilders.rangeQuery()返回)也有方法#gte()

  2. 根据文档:“在没有must或filter子句的布尔查询中,一个或多个should子句必须与文档相匹配。”因此,如果您没有filtermust,则可能无法获得所需的行为。以上答案假设您正在使用其他一些子句。 关键是你可以在bool查询中结合子句。对于Java API,这只是反复使用子句。

  3. 您可能想使用过滤器而不是should。这将导致更快的执行和缓存(https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

+1

非常感谢,先生。它真的帮了我:) –

+1

优秀的:)!请注意,如果您不需要评分结果,则可能需要使用'filter'而不是'should'。这将导致更快的执行和缓存(https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html) –

+0

不应该匹配student2('s2' ),因为他在60以上的计算机中得分。 – avr

相关问题