java - 我可以使用 Elastic Search Java API 按多个字段进行搜索吗?

标签 java elasticsearch elasticsearch-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)
            )

最佳答案

您可以在 bool 查询中有多个 .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 子句的 boolean 查询中,一个或多个 should 子句必须与文档匹配。”因此,如果您没有 filtermust,您可能无法获得所需的行为。上面的答案假设您正在使用其他一些条款。 重点是您可以在 bool 查询中组合子句。对于 Java API,这仅意味着重复使用子句。

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

关于java - 我可以使用 Elastic Search Java API 按多个字段进行搜索吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43394976/

相关文章:

java - 打印列表中所有启用的项目

elasticsearch - 找不到uri [/ModelName]和方法[POST]的处理程序

docker - Docker上的ElasticSearch集群

elasticsearch - 什么是执行关键字搜索的正确方法?

elasticsearch - 模糊化现有的ElasticSearch Java API查询

java - 在不知道字段是什么的情况下如何创建 ElasticSearch 查询?

java - 每次计算的参数要在多个监听器中传递

java - 在java接口(interface)声明中使用模板参数

elasticsearch - Elasticsearch 作为 BI 平台

java - 仅使用带有 lambda 的 Collection.sort() 对对象列表进行排序