我可以使用 Elastic Search Java API 按多个字段进行搜索吗?
Can I search by multiple fields using the Elastic Search Java API?
示例:
|studentname | maths | computers |
++++++++++++++++++++++++++++++++++
|s1 |78 |90 |
==================================
|s2 |56 |75 |
==================================
|s3 |45 |50 |
==================================
以上table表示Elasticsearch中存在的数据。
考虑到用户输入60 and above
那么Elasticsearch应该只能显示s1,因为他是唯一一个两科都超过60分的学生.
如何使用 Java API 解决?
注意:我能够通过以下方式找到个别主题:
QueryBuilder query = QueryBuilders.boolQuery()
.should(
QueryBuilders.rangeQuery(maths)
.from(50)
.to(100)
)
布尔查询中可以有多个 .should()
子句。所以在你的情况下:
QueryBuilder query = QueryBuilders.boolQuery()
.should(
QueryBuilders.rangeQuery(maths)
.from(61)
.to(100)
)
.should(
QueryBuilders.rangeQuery(computers)
.from(61)
.to(100)
)
注:
RangeQueryBuilder
(从QueryBuilders.rangeQuery()
返回)也有方法#gte()
.
根据文档:"In a boolean query with no must or filter clauses, one or more should clauses must match a document." 因此,如果您没有 filter
或 must
,您可能无法获得所需的行为。上面的答案假设您正在使用其他一些条款。 重点是您可以在 bool 查询中组合子句。 对于 Java API 这意味着重复使用该子句。
您可能想使用 filter 而不是 should。这将导致更快的执行和缓存 (https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html)
示例:
|studentname | maths | computers |
++++++++++++++++++++++++++++++++++
|s1 |78 |90 |
==================================
|s2 |56 |75 |
==================================
|s3 |45 |50 |
==================================
以上table表示Elasticsearch中存在的数据。
考虑到用户输入60 and above
那么Elasticsearch应该只能显示s1,因为他是唯一一个两科都超过60分的学生.
如何使用 Java API 解决?
注意:我能够通过以下方式找到个别主题:
QueryBuilder query = QueryBuilders.boolQuery()
.should(
QueryBuilders.rangeQuery(maths)
.from(50)
.to(100)
)
布尔查询中可以有多个 .should()
子句。所以在你的情况下:
QueryBuilder query = QueryBuilders.boolQuery()
.should(
QueryBuilders.rangeQuery(maths)
.from(61)
.to(100)
)
.should(
QueryBuilders.rangeQuery(computers)
.from(61)
.to(100)
)
注:
RangeQueryBuilder
(从QueryBuilders.rangeQuery()
返回)也有方法#gte()
.根据文档:"In a boolean query with no must or filter clauses, one or more should clauses must match a document." 因此,如果您没有
filter
或must
,您可能无法获得所需的行为。上面的答案假设您正在使用其他一些条款。 重点是您可以在 bool 查询中组合子句。 对于 Java API 这意味着重复使用该子句。您可能想使用 filter 而不是 should。这将导致更快的执行和缓存 (https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html)