从SearchQuery对象获取字符串查询(JSON)

jlg*_*dez 1 elasticsearch spring-data spring-data-elasticsearch

出于调试目的,我需要知道spring-data-elasticsearch正在向ElasticSearch集群发送什么查询.我试图toStringSearchQuery对象上调用方法,但不返回我需要的东西.

我在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();
Run Code Online (Sandbox Code Playgroud)

我希望返回类似ES集群REST API中执行的简单查询返回的内容:

{
    "query": {
        "filtered": {
            "filter": {
                "or": [
                    {
                        "term": {
                            "yaddayaddayadda.id": "9"
                        }
                    },
                    {
                        "term": {
                            "blahblahblah.id": "9"
                        }
                    }
                ]
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Val*_*Val 5

实现此目的的一种方法是将ES /服务器端的查询记录到slowlog文件中.打开elasticsearch.yml配置文件,然后在底部取消注释/编辑以下两行:

...
index.search.slowlog.threshold.query.info: 1ms
...
index.search.slowlog.threshold.fetch.info: 1ms
...
Run Code Online (Sandbox Code Playgroud)

此解决方案的优势在于,无论您使用什么客户端技术查询ES服务器(Spring数据,Ruby,浏览器,Javascript等),您都可以在单个位置转储和调试查询.