Сделать «запрос + агрегаты» эластичным поиском, используя Java-запрос dsl - PullRequest
1 голос
/ 26 июня 2019

Можно построить запрос с агрегацией (asticsearch), используя java-query-dsl?

1 Ответ

1 голос
/ 26 июня 2019

ElasticSearch предоставляет клиентскую библиотеку, которая помогает вам строить поиски.Вы можете найти больше об этом здесь .Вот пример того, как вы можете это сделать:

// build the client
    HttpHost host = new HttpHost("localhost", 9200, "http");
    RestHighLevelClient client = new RestHighLevelClient(RestClient
            .builder(new HttpHost[]{host}));

    // build the search (set the conditions here)
    BoolQueryBuilder boolQueryBuilder = boolQuery();
    boolQueryBuilder.must(QueryBuilders.rangeQuery("age")
            .from(25)
            .to(40));

    // build the aggregations (set the aggregations here)
    TermsAggregationBuilder groupByGender = AggregationBuilders.terms("gender")
            .field("gender")
            .size(5);

    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(boolQueryBuilder);
    sourceBuilder.aggregation(groupByGender);

    // create and execute the search request
    SearchRequest request = new SearchRequest()
            .indices("customers")
            .types("customer")
            .allowPartialSearchResults(false)
            .source(sourceBuilder)
            .requestCache(true);

    SearchResponse response = client.search(request, RequestOptions.DEFAULT);

, который будет производить что-то вроде:

GET customers/customer/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "age": {
              "gt": 25,
              "lt": 40
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "gender": {
      "terms": {
        "field": "gender",
        "size": 5
      }
    }
  }
}
...