出于调试目的,我需要知道spring-data-elasticsearch正在向ElasticSearch集群发送什么查询。我试图在toString
对象上调用SearchQuery
方法,但不返回我需要的内容。
我在Java中做的事情(使用spring-data-elasticsearch)是:
private FilterBuilder getFilterBuilder(String id) {
return orFilter(
termFilter("yaddayaddayadda.id", id),
termFilter("blahblahblah.id", id)
);
}
SearchQuery sq = NativeSearchQueryBuilder()
.withQuery(new MatchAllQuery())
.withFilter(fb)
.build();
我希望返回类似ES集群REST API中执行的简单查询返回的内容:
{
"query": {
"filtered": {
"filter": {
"or": [
{
"term": {
"yaddayaddayadda.id": "9"
}
},
{
"term": {
"blahblahblah.id": "9"
}
}
]
}
}
}
}
提前致谢!
答案 0 :(得分:5)
实现此目的的一种方法是将ES /服务器端的查询记录到slowlog文件中。打开您的elasticsearch.yml
配置文件,然后在底部取消注释/编辑以下两行:
...
index.search.slowlog.threshold.query.info: 1ms
...
index.search.slowlog.threshold.fetch.info: 1ms
...
此解决方案的优势在于,无论您使用何种客户端技术查询ES服务器(Spring数据,Ruby,浏览器,Javascript等),您都可以转储和调试查询在一个地方。
答案 1 :(得分:0)
SearchQuery Interface有一个方法getQuery()和getFilter()来获取你需要的信息。
System.out.println(searchQuery.getQuery());
System.out.println(searchQuery.getFilter());
希望这有帮助。
答案 2 :(得分:0)
使用SearchRequest
或SearchSourceBuilder
时,在其实例上调用.toString()
方法将获得实际的JSON查询:
SearchRequest searchRequest = new SearchRequest("index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// building the query
// ...
searchSourceBuilder.query(query);
searchRequest.source(searchSourceBuilder);
System.out.println(searchSourceBuilder.toString()); // prints json query
System.out.println(searchRequest.toString()); // prints json query + other information