gpt4 book ai didi

java - ElasticSearch 2.0 Java API 聚合过滤器与 query_string

转载 作者:行者123 更新时间:2023-11-30 03:11:29 25 4
gpt4 key购买 nike

在通过 Java API 连接的 ElasticSearch 2.0 上运行。我通过 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。分面查询比我在示例中显示的要复杂一些,每个 Solr 分面查询中引用了多个字段和条件,这就是为什么我想将 Lucene 查询与 query_string 一起使用。

任何想法都感激不尽!谢谢。

最佳答案

由于 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();

关于java - ElasticSearch 2.0 Java API 聚合过滤器与 query_string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33549376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com