API Javaasticsearch с сервером Elasticsearch на компьютере WM

Я делаю запрос на Elasticsearch из Kibana 4.4.1, который выглядит следующим образом:

{
  "size": 0,
  "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "FALK0911622560T",
          "analyze_wildcard": true
        }
      },
      "filter": {
        "bool": {
          "must": [
            {
              "range": {
                "@timestamp": {
                  "gte": 1438290000000,
                  "lte": 1440968400000,
                  "format": "epoch_millis"
                }
              }
            }
          ],
          "must_not": []
        }
      }
    }
  },
  "aggs": {
    "2": {
      "date_histogram": {
        "field": "@timestamp",
        "interval": "1w",
        "time_zone": "Europe/Helsinki",
        "min_doc_count": 1,
        "extended_bounds": {
          "min": 1438290000000,
          "max": 1440968400000
        }
      },
      "aggs": {
        "1": {
          "percentiles": {
            "field": "Quantity",
            "percents": [
              50
            ]
          }
        }
      }
    }
  }
}

Этот фрагмент кода вернет все документы с "ProductCode" = FALK0911622560T"между заданным интервалом.

Я попытался сделать то же самое с Elasticsearch Java API со следующим кодом:

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery(matchQueryKey,matchQueryValue));

        SearchResponse response = client.prepareSearch(indexName)
                .setTypes(indexTypeName)
                .setQuery(boolQueryBuilder)
                .setSize(100)
                .addAggregation(AggregationBuilders
                        .dateHistogram("myHistogram")
                        .field("@timestamp")
                        .interval(DateHistogramInterval.WEEK)
                        .timeZone("Europe/Helsinki")
                        .minDocCount(1)
                        .extendedBounds(1438290000000L, 1440968400000L))
                .addFields(fieldsOfInterest)
                .execute()
                .actionGet();

        response.getAggregations();

Но я получаю все документы в индексе с "ProductCode" = FALK0911622560T.

Между указанным временем у меня должно быть только 5 документов на response.getAgregations(), потому что я установил интервал в неделю.

Документ в Elasticsearch выглядит так:

{
  "_index": "warehouse-550",
  "_type": "core2",
  "_id": "AVOKCqQ68h4KkDGZvk6b",
  "_score": null,
  "_source": {
    "message": "5,550,67.01,FALK0911622560T,2015-07-31;08:00:00.000\r",
    "@version": "1",
    "@timestamp": "2015-07-31T06:00:00.000Z",
    "path": "D:/Programs/Logstash/x_testingLocally/processed-stocklevels-550-25200931072015.csv",
    "host": "EVO385",
    "type": "core2",
    "Quantity": 5,
    "Warehouse": "550",
    "Price": 67.01,
    "ProductCode": "FALK0911622560T",
    "Timestamp": "2015-07-31;08:00:00.000"
  },
  "fields": {
    "@timestamp": [
      1438322400000
    ]
  },
  "highlight": {
    "ProductCode": [
      "@kibana-highlighted-field@FALK0911622560T@/kibana-highlighted-field@"
    ],
    "message": [
      "5,550,67.01,@kibana-highlighted-field@FALK0911622560T@/kibana-highlighted-field@,2015-07-31;08:00:00.000\r"
    ]
  },
  "sort": [
    1438322400000
  ]
}

Пожалуйста помоги. Спасибо.

1 ответ

Решение

Вы не добавили rangeQuery, Измени свой boolQueryBuilder к следующему:

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery(matchQueryKey,matchQueryValue)).must(QueryBuilders.rangeQuery("@timestamp").gte(fromValue).lte(toValue));

Вы можете получить ведра, используя:

InternalDateHistogram histogram = searchResponse.getAggregations().getAsMap().get(aggregation_name);
List bucketList = histogram?.getBuckets()
Другие вопросы по тегам