2015-11-05 94 views
1

在通过Java API连接的ElasticSearch 2.0上运行。我有通过REST API工作的以下查询,但无法弄清楚如何使用Java API来完成此操作。ElasticSearch 2.0具有query_string的Java API聚合过滤器

{ 
    "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_string部分通过。

由于有点背景的,最初使用的Solr所以有需要被翻译成多ElasticSearch Solr的面查询。这个方面的查询比我在示例中显示的要复杂一点,在每个Solr构面查询中引用了多个字段和条件,这就是为什么我要使用带有query_string的Lucene查询的原因。

任何想法感激地接受!谢谢。

回答

2

由于它看起来像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(); 
+0

Thanks @Val - 我的实际Solr方面查询更复杂,使用mu ltiple字段和条件,这就是为什么我最好喜欢使用lucene查询(使用Solr我在lucene查询中传递) –

+0

好的,对不起,我会修复并通知您。 – Val

+0

真棒!谢谢:) –

相关问题