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

时间:2015-05-18 15:36:54

标签: elasticsearch spring-data spring-data-elasticsearch

出于调试目的,我需要知道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"
                        }
                    }
                ]
            }
        }
    }
}

提前致谢!

3 个答案:

答案 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)

使用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
相关问题