当前位置: 首页 > 知识库问答 >
问题:

如何重现ElasticSearch查询?

赵嘉赐
2023-03-14

我使用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请求联系起来吗?

共有1个答案

何宏博
2023-03-14

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

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

2) 我想你不想重复基巴纳的提问。例如,我在json中没有找到“严重性”字段,java中缺少聚合部分,您到底在寻找什么?。。。。请分享你的映射

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

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

 类似资料:
  • 问题内容: 当存储一些文档时,它应该存储不存在的文档并忽略其余文档(应该在应用程序级别完成,也许检查文档的ID是否已经存在,等等?) 问题答案: 这是文档中说明的内容: 操作类型 索引操作还接受可用于强制执行创建操作的op_type,从而允许“如果不存在”行为。使用create时,如果索引中已经存在具有该ID的文档,则索引操作将失败。 这是使用op_type参数的示例: 指定create的另一个选

  • 我有一个索引,其中一些文档有一个名为“access_type”的字段。它可以有两个值,要么是“教师”,要么是“学生”。对于“access_type”的值为“afully”的文档,将有另一个名为“faculties”的字段,这是一个学院名称列表。因此,一个示例文档如下所示: 现在,如果我们有两个输入,比如说一个用于access_type,另一个用于facculties。如果我得到以下输入“facul

  • 问题内容: 我如何询问我的Elasticsearch服务器目前有多少个连接打开? 这和插座数一样吗?(我也不知道如何获得这些数字) 这与客户端的数量不同,对,因为每个客户端都可以打开多个连接? 虽然我确实发现您可以在Elasticsearch客户端上为每个客户端指定一个maxSockets,但找不到任何信息:https ://www.elastic.co/guide/en/elasticsearc

  • 我是Elasticsearch新手,对匹配查询的工作方式感到困惑。我有以下映射: 我批量导入了以下文档 我验证了所有文档都已成功加载。然后我执行匹配查询: 它只返回#1文档。我在这里感到困惑。为什么它不返回所有三个文档?我应该使用什么查询来返回这三个文档,因为它们在字段中都有“quiet”根单词? 谢谢和问候。

  • 问题内容: 我已经在Elasticsearch之上构建了一个Web应用程序。我想使用Java进行多重过滤。 Elasticsearch查询: 我想过滤查询,以便它应该在具有两个不同值(例如“ xyz”和“ abc”)的同一字段上进行过滤 现在,我已经为单个过滤器编写了Java程序。 如何在同一字段上为多个值过滤查询? 编辑 : 实际上,在我的Web应用程序中,我将集合的值提取为: 收藏是我的Ela

  • 问题内容: 当我将Flashlight与Firebase结合使用并通过直接查询进行Elastic搜索时,它确实起作用: 询问 码 但是,当我希望不仅限于10条提示时,此操作将失败(无结果) 询问 码 我使用Flashlight示例中提供的选项,并为option添加零件: 为什么可以在https://github.com/firebase/flashlight/issues/29#issuecomm