示例:
|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 :(得分:6)
您可以在bool查询中包含多个.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()
。
根据文档:"在没有must或filter子句的布尔查询中,一个或多个should子句必须与文档匹配。"因此,如果您没有filter
或must
,则可能无法获得所需的行为。上面的答案假设您正在使用其他一些条款。 重点是你可以在bool查询中组合子句。使用Java API,这只是意味着重复使用该子句。
您可能希望使用过滤器而不是应该使用过滤器。这将导致更快的执行和缓存(https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html)