ElasticSearch 2.0 Java API 聚合过滤器 query_string
ElasticSearch 2.0 Java API aggregate filter with query_string
运行 在 ElasticSearch 2.0 上通过 Java API 连接。我通过 REST API 获得了以下查询,但无法弄清楚如何使用 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,因此有多个 Solr 方面的查询需要转换为 ElasticSearch。 facet 查询比我在示例中显示的要复杂一些,每个 Solr facet 查询中都引用了多个字段和条件,这就是为什么我想使用带 query_string
的 Lucene 查询。
感谢收到任何想法!谢谢。
因为看起来 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();
运行 在 ElasticSearch 2.0 上通过 Java API 连接。我通过 REST API 获得了以下查询,但无法弄清楚如何使用 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,因此有多个 Solr 方面的查询需要转换为 ElasticSearch。 facet 查询比我在示例中显示的要复杂一些,每个 Solr facet 查询中都引用了多个字段和条件,这就是为什么我想使用带 query_string
的 Lucene 查询。
感谢收到任何想法!谢谢。
因为看起来 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();