3

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

提前致谢!

4

3 回答 3

5

实现此目的的一种方法是将 ES/服务器端的查询记录到慢日志文件中。打开您的elasticsearch.yml配置文件并朝底部取消注释/编辑以下两行:

...
index.search.slowlog.threshold.query.info: 1ms
...
index.search.slowlog.threshold.fetch.info: 1ms
...

该解决方案的优势在于,无论您使用何种客户端技术来查询 ES 服务器(Spring Data、Ruby、浏览器、Javascript 等),您都可以在一个位置转储和调试查询。

于 2015-05-18T18:39:45.697 回答
1

SearchQuery 接口有一个方法 getQuery() 和 getFilter() 来获取您需要的信息。

        System.out.println(searchQuery.getQuery());
        System.out.println(searchQuery.getFilter());

希望这可以帮助。

于 2015-05-22T12:43:22.830 回答
0

使用SearchRequestor时,在其实例上SearchSourceBuilder调用方法将为您提供实际的 JSON 查询:.toString()

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
于 2018-02-19T12:16:17.523 回答