从 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());

希望对您有所帮助。

当使用 SearchRequestSearchSourceBuilder 时,在它们的实例上调用 .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