由于它看起来像myfield
是一个整数字段,因此可以使用range
筛选器而不是query_string
,它更适用于文本匹配。既然你有两个感兴趣的范围,我建议使用range
aggregation,它允许你定义几个范围桶(注意to
参数不包括在范围内)。然后,您的查询会是这样的:
{
"query": {
"query_string": {
"query": "myfield:*"
}
},
"aggs": {
"high_low": {
"range": {
"field": "myfield",
"keyed": true,
"ranges": [
{
"key": "foo_low",
"from": 1,
"to": 6
},
{
"key": "foo_high",
"from": 6,
"to": 11
}
]
}
}
}
}
翻译成Java代码,它是这样的:
// 1. bootstrap the query
SearchRequestBuilder search = node.client().prepareSearch()
.setSize(0).setFrom(0)
.setQuery(QueryBuilders.queryStringQuery("myfield:*"));
// 2. create the range aggregation
RangeBuilder rangeAgg = AggregationBuilders.range("high_low").field("myfield");
rangeAgg.addRange("foo_low", 1, 6);
rangeAgg.addRange("foo_high", 6, 11);
search.addAggregation(rangeAgg);
// 3. execute the query
SearchResponse response = search.execute().actionGet();
**更新**
按照要求,这里是Java代码将生成您发布的确切查询:
// 1. bootstrap the query
SearchRequestBuilder search = node.client().prepareSearch()
.setSize(0).setFrom(0)
.setQuery(QueryBuilders.queryStringQuery("myfield:*"));
// 2. create the filter aggregations
FilterAggregationBuilder lowAgg = AggregationBuilders
.filter("foo_low")
.filter(QueryBuilders.queryStringQuery("myfield:[1 TO 5]"));
search.addAggregation(lowAgg);
FilterAggregationBuilder highAgg = AggregationBuilders
.filter("foo_high")
.filter(QueryBuilders.queryStringQuery("myfield:[6 TO 10]"));
search.addAggregation(highAgg);
// 3. execute the query
SearchResponse response = search.execute().actionGet();
来源
2015-11-06 05:41:41
Val
Thanks @Val - 我的实际Solr方面查询更复杂,使用mu ltiple字段和条件,这就是为什么我最好喜欢使用lucene查询(使用Solr我在lucene查询中传递) –
好的,对不起,我会修复并通知您。 – Val
真棒!谢谢:) –