带有查询字符串的ElasticSearch 2.0 Java API聚合筛选器
在ElasticSearch 2.0上运行,通过Java API连接。我已经通过restapi实现了以下查询,但我不知道如何使用javaapi实现这一点带有查询字符串的ElasticSearch 2.0 Java API聚合筛选器,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,在ElasticSearch 2.0上运行,通过Java API连接。我已经通过restapi实现了以下查询,但我不知道如何使用javaapi实现这一点 { "query": { "query_string": { "query": "myfield:*" } }, "aggs" : { "foo_low": { "filter" : { "query" : { "query_string" : {
{
"query": {
"query_string": {
"query": "myfield:*"
}
},
"aggs" : {
"foo_low": {
"filter" : {
"query" : {
"query_string" : {
"query": "myfield:[1 TO 5]"
}
}
}
},
"foo_high": {
"filter" : {
"query" : {
"query_string" : {
"query": "myfield:[6 TO 10]"
}
}
}
}
}
}
我已经看了使用addAggregation
方法的示例,但不确定如何传入query\u string
部分
作为一个背景,最初使用Solr,因此有多个Solr方面的查询需要转换为ElasticSearch。facet查询比我在示例中展示的要复杂一些,每个Solr facet查询中引用了多个字段和条件,这就是为什么我想使用Lucene查询和query\u string
感谢您的任何意见!谢谢。因为
myfield
看起来像是一个整数字段,所以您可以使用范围
过滤器而不是查询字符串
,后者更适合文本匹配。由于您有两个感兴趣的范围,我建议使用,它允许您定义多个范围桶(请注意,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
}
]
}
}
}
}
// 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代码后,如下所示:
{
"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
}
]
}
}
}
}
// 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();
谢谢@Val-我实际的Solr方面查询更复杂,并且使用多个字段和条件,这就是为什么我理想地希望使用lucene查询(我在lucene查询中传递Solr)好的,很抱歉,我会修复并让您知道。太棒了!谢谢:)谢谢你,很乐意帮忙!