从 SearchQuery 对象获取字符串查询 (JSON)
Obtaining string query (JSON) from SearchQuery object
出于调试目的,我需要知道 spring-data-elasticsearch 正在向 ElasticSearch 集群发送什么查询。我试图调用 SearchQuery
对象的 toString
方法,但 return 不是我需要的。
我在 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();
我希望 return 在 ES 集群 REST API 中执行类似这个普通查询的东西是 returning:
{
"query": {
"filtered": {
"filter": {
"or": [
{
"term": {
"yaddayaddayadda.id": "9"
}
},
{
"term": {
"blahblahblah.id": "9"
}
}
]
}
}
}
}
提前致谢!
实现此目的的一种方法是将 ES/server-side 上的查询记录到慢日志文件中。打开您的 elasticsearch.yml
配置文件并在底部 uncomment/edit 下面两行:
...
index.search.slowlog.threshold.query.info: 1ms
...
index.search.slowlog.threshold.fetch.info: 1ms
...
此解决方案的优势在于,无论您使用何种客户端技术来查询您的 ES 服务器(Spring 数据、Ruby、浏览器、Javascript 等),您'将能够在一个位置转储和调试您的查询。
SearchQuery 接口有一个方法 getQuery() 和 getFilter() 来获取您需要的信息。
System.out.println(searchQuery.getQuery());
System.out.println(searchQuery.getFilter());
希望对您有所帮助。
当使用 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
出于调试目的,我需要知道 spring-data-elasticsearch 正在向 ElasticSearch 集群发送什么查询。我试图调用 SearchQuery
对象的 toString
方法,但 return 不是我需要的。
我在 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();
我希望 return 在 ES 集群 REST API 中执行类似这个普通查询的东西是 returning:
{
"query": {
"filtered": {
"filter": {
"or": [
{
"term": {
"yaddayaddayadda.id": "9"
}
},
{
"term": {
"blahblahblah.id": "9"
}
}
]
}
}
}
}
提前致谢!
实现此目的的一种方法是将 ES/server-side 上的查询记录到慢日志文件中。打开您的 elasticsearch.yml
配置文件并在底部 uncomment/edit 下面两行:
...
index.search.slowlog.threshold.query.info: 1ms
...
index.search.slowlog.threshold.fetch.info: 1ms
...
此解决方案的优势在于,无论您使用何种客户端技术来查询您的 ES 服务器(Spring 数据、Ruby、浏览器、Javascript 等),您'将能够在一个位置转储和调试您的查询。
SearchQuery 接口有一个方法 getQuery() 和 getFilter() 来获取您需要的信息。
System.out.println(searchQuery.getQuery());
System.out.println(searchQuery.getFilter());
希望对您有所帮助。
当使用 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