簡體   English   中英

帶有query_string的ElasticSearch 2.0 Java API聚合過濾器

[英]ElasticSearch 2.0 Java API aggregate filter with query_string

在通過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聚合 ,它允許您定義多個范圍存儲桶(請注意, 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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM