0

我有 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);

不幸的是,即使“服务”值错误,我的代码也会返回错误的结果。

您能帮我将我的 Java 请求与 JSON 对齐吗?

4

1 回答 1

0

1)分数不会一样。过滤器不计入分数,但在您的 java 代码中,您使用查询代替,因此排序会有所不同。

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

2)我认为您不想完全重现 kibana 的查询。例如,我没有在 json 中找到“严重性”字段,并且您的 java 中缺少聚合部分,您到底在寻找什么?....请分享您的映射

3)请比较kibana和您的文档时间戳之间的日期时间。有时使用时区,kibana 会显示不同的时间。

4)如评论中所说,调试时必须有生成的JSON,这可以帮助你。

于 2020-02-24T11:18:25.553 回答