我可以使用Elastic Search Java API搜索多个字段吗?

Abh*_*nth 1 java elasticsearch elasticsearch-java-api

例:

|studentname | maths | computers |
++++++++++++++++++++++++++++++++++
|s1          |78     |90         |
==================================
|s2          |56     |75         |
==================================
|s3          |45     |50         |
==================================
Run Code Online (Sandbox Code Playgroud)

上表表示Elasticsearch中存在的数据.

考虑到用户输入60 and above然后Elasticsearch应该只能显示s1,因为他是唯一一个在两个科目中得分超过60的学生.

如何使用Java API解决它?

注意:我能够通过以下方式找到个别科目:

    QueryBuilder query = QueryBuilders.boolQuery()
            .should(
                     QueryBuilders.rangeQuery(maths)
                    .from(50)
                    .to(100)
            )
Run Code Online (Sandbox Code Playgroud)

Dmi*_*sky 6

您可以.should()在bool查询中包含多个子句.所以在你的情况下:

QueryBuilder query = QueryBuilders.boolQuery()
        .should(
                 QueryBuilders.rangeQuery(maths)
                .from(61)
                .to(100)
        )
        .should(
                 QueryBuilders.rangeQuery(computers)
                .from(61)
                .to(100)
        )
Run Code Online (Sandbox Code Playgroud)

注意:

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

  2. 根据文档:"在没有must或filter子句的布尔查询中,一个或多个should子句必须与文档匹配." 因此,如果您没有filtermust,您可能无法获得所需的行为.上面的答案假设您正在使用其他一些条款.关键是你可以在bool查询中组合子句.使用Java API,这只是意味着重复使用该子句.

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