21

我使用 spring-data-elasticsearch 框架从 elasticsearch 服务器获取查询结果,java 代码如下:

SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchAllQuery()).withSearchType(SearchType.COUNT)
.addAggregation(new MinBuilder("min_createDate").field("createDate"))
.build();

List<Entity> list = template.queryForList(searchQuery, Entity.class);

虽然我如何知道发送到 elasticssearch 服务器的原始 http 查询?如何启用日志记录,我尝试添加 log4j,但似乎 spring-data-elasticsearch 没有记录查询。

4

7 回答 7

13

在挖掘了 spring 数据代码后,我发现了这个有用的小记录器,叫做“tracer”(名字不是很独特)

通过在 application.properties 中设置以下内容

logging.level.tracer=TRACE

它将打印出请求的完整 curl 语句以及来自 Elasticsearch 的完整 JSON 响应。

于 2020-01-07T15:46:58.980 回答
11

这个已经很老了,但我仍然想分享对我有用的解决方案。要记录通过存储库执行的 Spring Data Elasticsearch 查询,您需要DEBUG为包启用日志记录org.springframework.data.elasticsearch.core.*,例如如下:

logging:
  level:
    org:
      springframework:
        data:
          elasticsearch:
            core: DEBUG

之后,查询将出现在日志中:

{
  "from" : 0,
  "size" : 1,
  "query" : {
    "bool" : {
      "should" : [ {
        "query_string" : {
          "query" : "John Doe",
          "fields" : [ "entityName" ],
          "default_operator" : "and"
        }
      }, {
        "query_string" : {
          "query" : "John Doe",
          "fields" : [ "alias" ],
          "default_operator" : "and"
        }
      } ]
    }
  },
  "post_filter" : {
    "bool" : { }
  }
}

人们会期待一种类似于 JPA 的优雅解决方案,但它似乎并不简单存在。

使用 Spring Boot 1.4.0 和 Spring Data Elasticsearch 1.7.3 进行测试。

于 2018-04-13T14:33:28.300 回答
10

如果您使用的是 spring boot,您可以在 application.properties 中设置以下内容:

logging.level.org.elasticsearch.index.search.slowlog.query=INFO
spring.data.elasticsearch.properties.index.search.slowlog.threshold.query.info=1ms
于 2015-06-18T15:39:15.780 回答
9

我没有 Spring Data Elasticsearch 的答案,但是在 ES 本身中,您可以提高慢查询日志记录的默认设置并查看慢日志中的所有查询。更多关于慢日志的细节在这里

至于如何更改阈值,应该使用这样的命令:

PUT /_settings
{
  "index.search.slowlog.threshold.query.info": "1ms"
}

1ms是您可以设置的最小值。

于 2015-06-07T11:10:14.477 回答
4

我遇到了同样的问题,在 ElasticsearchTemplate 中只有少数方法具有日志调试级别,例如:

public <T> Page<T> queryForPage(CriteriaQuery criteriaQuery, Class<T> clazz) {
    QueryBuilder elasticsearchQuery = new CriteriaQueryProcessor().createQueryFromCriteria(criteriaQuery.getCriteria());
    QueryBuilder elasticsearchFilter = new CriteriaFilterProcessor().createFilterFromCriteria(criteriaQuery.getCriteria());
    SearchRequestBuilder searchRequestBuilder = prepareSearch(criteriaQuery, clazz);

    if (elasticsearchQuery != null) {
        searchRequestBuilder.setQuery(elasticsearchQuery);
    } else {
        searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery());
    }

    if (criteriaQuery.getMinScore() > 0) {
        searchRequestBuilder.setMinScore(criteriaQuery.getMinScore());
    }

    if (elasticsearchFilter != null)
        searchRequestBuilder.setPostFilter(elasticsearchFilter);
    if (logger.isDebugEnabled()) {
        logger.debug("doSearch query:\n" + searchRequestBuilder.toString());
    }

    SearchResponse response = getSearchResponse(searchRequestBuilder
            .execute());
    return resultsMapper.mapResults(response, clazz, criteriaQuery.getPageable());
}
于 2017-04-18T11:49:28.190 回答
3

这适用于 Spring Boot2.3.3.RELEASE

logging.level.org.springframework.data.elasticsearch.client.WIRE=trace

于 2021-04-12T20:40:49.977 回答
0

只是将我的两分钱添加到@AndreiStefan:现在您可以设置0ms而不是1ms. 使用这种方法似乎可以捕获一些非常快速的查询。

只需这样做:

PUT /_settings
{
  "index.search.slowlog.threshold.query.info": "0ms"
}
于 2021-03-10T06:41:35.970 回答