带有查询字符串的ElasticSearch 2.0 Java API聚合筛选器

带有查询字符串的ElasticSearch 2.0 Java API聚合筛选器,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,在ElasticSearch 2.0上运行,通过Java API连接。我已经通过restapi实现了以下查询,但我不知道如何使用javaapi实现这一点 { "query": { "query_string": { "query": "myfield:*" } }, "aggs" : { "foo_low": { "filter" : { "query" : { "query_string" : {

在ElasticSearch 2.0上运行,通过Java API连接。我已经通过restapi实现了以下查询,但我不知道如何使用javaapi实现这一点

{
  "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\u string
部分

作为一个背景,最初使用Solr,因此有多个Solr方面的查询需要转换为ElasticSearch。facet查询比我在示例中展示的要复杂一些,每个Solr facet查询中引用了多个字段和条件,这就是为什么我想使用Lucene查询和
query\u string


感谢您的任何意见!谢谢。

因为
myfield
看起来像是一个整数字段,所以您可以使用
范围
过滤器而不是
查询字符串
,后者更适合文本匹配。由于您有两个感兴趣的范围,我建议使用,它允许您定义多个范围桶(请注意,
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
          }
        ]
      }
    }
  }
}
// 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代码后,如下所示:

{
  "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
          }
        ]
      }
    }
  }
}
// 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查询(我在lucene查询中传递Solr)好的,很抱歉,我会修复并让您知道。太棒了!谢谢:)谢谢你,很乐意帮忙!