Как воспроизвести запрос ElasticSearch? - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть запрос ElasticSearch, с помощью которого я получаю данные через Kibana. Мне также требуется такой же запрос в моем приложении Java. Запрос, сгенерированный Kibana, выглядит следующим образом:

{
  "version": true,
  "size": 500,
  "sort": [
    {
      "@timestamp": {
        "order": "desc",
        "unmapped_type": "boolean"
      }
    }
  ],
  "_source": {
    "excludes": []
  },
  "aggs": {
    "2": {
      "date_histogram": {
        "field": "@timestamp",
        "fixed_interval": "30s",
        "time_zone": "Europe/Berlin",
        "min_doc_count": 1
      }
    }
  },
  "stored_fields": [
    "*"
  ],
  "script_fields": {},
  "docvalue_fields": [
    {
      "field": "@timestamp",
      "format": "date_time"
    }
  ],
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "ORDERID=120019",
            "analyze_wildcard": true,
            "time_zone": "Europe/Berlin"
          }
        }
      ],
      "filter": [
        {
          "match_phrase": {
            "service": {
              "query": "some-service-app"
            }
          }
        },
        {
          "range": {
            "@timestamp": {
              "format": "strict_date_optional_time",
              "gte": "2020-02-24T09:12:41.685Z",
              "lte": "2020-02-24T09:27:41.685Z"
            }
          }
        }
      ],
      "should": [],
      "must_not": []
    }
  },
  "highlight": {
    "pre_tags": [
      "@kibana-highlighted-field@"
    ],
    "post_tags": [
      "@/kibana-highlighted-field@"
    ],
    "fields": {
      "*": {}
    },
    "fragment_size": 2147483647
  }
}

Я пытаюсь составить тот же запрос, используя ElasticSearch Java API, но получаю совершенно разные результаты, которые вообще не соответствуют ожидаемому результату.

Не могли бы вы помочь мне найти правильный? То, как я делаю это сейчас, приведено ниже.

    final QueryBuilder query = QueryBuilders.boolQuery()
            .must(QueryBuilders.simpleQueryStringQuery("some-service-app").field("service"))
            .must(QueryBuilders.simpleQueryStringQuery("INFO").field("severity"))
            .must(QueryBuilders.rangeQuery("@timestamp").from(now.minusDays(15)))
            .must(QueryBuilders.simpleQueryStringQuery("ORDERID=120019"));
    final SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(query);
    final SearchRequest searchRequest = new SearchRequest(targetIndexName);
    searchRequest.source(sourceBuilder);
    final SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);

К сожалению, мой код возвращает неверные результаты даже при неправильных значениях "service".

Не могли бы вы помочь мне выровнять мой Java запрос с JSON один?

1 Ответ

0 голосов
/ 24 февраля 2020

1) Счет не будет таким же. Фильтр не учитывается в счете, но в вашем java коде вы используете запрос, поэтому сортировка будет другой.

read: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html

2) Я думаю, что вы не хотите точно воспроизводить запрос кибаны. Например, я не нашел поле «серьезность» в json, а часть агрегации отсутствует в вашем java, что именно вы ищете? .... Пожалуйста, поделитесь вашими сопоставлениями

3) Пожалуйста, сравните дату и время между кибаной и отметкой времени ваших документов. Иногда в часовом поясе кибана показывает разные часы.

4) Как сказано в комментариях, у вас должен быть сгенерированный JSON при отладке, это может помочь вам.

...