【问题标题】:ElasticSearch 2.0 Java API aggregate filter with query_string带有 query_string 的 ElasticSearch 2.0 Java API 聚合过滤器
【发布时间】:2015-11-05 16:05:32
【问题描述】:

在通过 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 一起使用。

感谢您的任何想法!谢谢。

【问题讨论】:

    标签: java elasticsearch elasticsearch-2.0


    【解决方案1】:

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

    【讨论】:

    • 感谢@Val - 我实际的 Solr 方面查询更复杂,并且使用多个字段和条件,这就是为什么我最喜欢使用 lucene 查询(使用 Solr 我传入 lucene 查询)
    • 好的,很抱歉,我会修复并通知您。
    • 太棒了!谢谢你:)
    • 谢谢,很高兴为您提供帮助!
    猜你喜欢
    • 2017-03-02
    • 2015-03-31
    • 2014-10-09
    • 2015-09-17
    • 2014-02-02
    • 2020-09-05
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    相关资源
    最近更新 更多