1

在通过 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.

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

4

1 回答 1

2

由于它看起来像是myfield一个整数字段,因此您可以使用range过滤器而不是query_string更适合文本匹配的过滤器。由于您有两个感兴趣的范围,我建议使用允许您定义多个范围桶的range聚合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-06T05:41:41.820 回答