【问题标题】:Can I search by multiple fields using the Elastic Search Java API?我可以使用 Elastic Search Java API 按多个字段进行搜索吗?
【发布时间】:2017-04-13 14:29:22
【问题描述】:

示例:

|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)
            )

【问题讨论】:

  • 一开始误会你了。更新了我的答案。

标签: java elasticsearch elasticsearch-java-api


【解决方案1】:

布尔查询中可以有多个.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. 您可能希望使用过滤器而不是应该。这将导致更快的执行和缓存 (https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html)

【讨论】:

  • 优秀:)!请注意,如果您不需要对结果进行评分,您可能希望使用filter 而不是should。这将导致更快的执行和缓存 (elastic.co/guide/en/elasticsearch/reference/current/…)
  • 不应该匹配 student2(s2),因为他的计算机分数超过 60。
  • @avr 是的,我想它可能会。正如它在文档中所说:“在没有 must 或 filter 子句的布尔查询中,一个或多个 should 子句必须与文档匹配。”但是我把它留给了 OP 来测试,并且没有假设他没有其他条款。我会使用filtermust 而不是should。我会编辑答案,谢谢。
  • 是的,我们需要使用filter(我会使用过滤器,因为它比查询更高效)或must
  • 是的,我用所有这些注释更新了答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-08-10
  • 2020-10-08
  • 1970-01-01
  • 2015-05-20
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
相关资源
最近更新 更多