私は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がクエリをログに記録しないようです。
Spring Data Elasticsearchに対する回答はありませんが、ES自体で、低速クエリログのデフォルト設定を上げて、低速ログ内のすべてのクエリを確認できます。遅いログの詳細 ここ 。
しきい値を変更する方法については、次のようなコマンドを使用する必要があります。
PUT /_settings
{
"index.search.slowlog.threshold.query.info": "1ms"
}
1ms
は、設定できる最小値の一種です。
Spring Bootを使用している場合は、application.propertiesで以下を設定できます。
logging.level.org.elasticsearch.index.search.slowlog.query=INFO
spring.data.elasticsearch.properties.index.search.slowlog.threshold.query.info=1ms
これはかなり古いですが、それでも私のために働いた解決策を共有したいと思います。リポジトリを介して実行されたSpringData Elasticsearchクエリをログに記録するには、パッケージorg.springframework.data.elasticsearch.core.*
に対してDEBUG
ログを有効にする必要があります。次のように:
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 Boot1.4.0およびSpringData Elasticsearch1.7.3でテスト済み。
春のデータコードを掘り下げた後、私は「トレーサー」と呼ばれるこの便利な小さなロガーを見つけました(名前はあまりユニークではありません)
Application.propertiesで以下を設定する
logging.level.tracer=TRACE
Elasticsearchからの応答の完全なJSONとともに、要求の完全なcurlステートメントを出力します。
同じ問題が発生しました。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());
}