我有一个需要将弹性搜索查询传递给REST端点的要求,如下所示:
{
query : {
match_all : {}
}
}
因此,可以这样说,我正在从UI获取参数。像AND,OR,GroupBy,“要搜索的文本”等。
如何在Java中实现此功能以动态构建查询字符串?
我是弹性搜索的新手,因此请探索产生查询字符串的方式。
任何建议都会有所帮助。
编辑1: 可能是询问上述问题的另一种方式: 如何将“ SearchSourceBuilder”或“ QueryBuilder”转换为Json?
答案 0 :(得分:0)
请在此处查看Elasticsearch Java客户端搜索api:https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-search.html
为Java使用高级Rest客户端与上面的api几乎相同,但是它将使您的代码更具前瞻性,因为在即将发布的版本中https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-search.html 会改变连接集群的方式。 >
这两个api都会为您构建查询,并负责请求和响应的处理。但是,如果您想查看生成的json查询字符串,则可以始终在QueryBuilder对象上调用toString()方法。
以下是高级REST客户端的示例:
org.elasticsearch.index.query.QueryBuilders.matchAllQuery().toString()
{
"match_all" : {
"boost" : 1.0
}
}
在SearchSourceBuilder中使用可为您提供更完整的JSON:
MatchAllQueryBuilder matchAllQuery = QueryBuilders.matchAllQuery();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(matchAllQuery);
然后searchSourceBuilder.toString()产生
{"query":{"match_all":{"boost":1.0}}}
在这里使用Java-API:
SearchRequestBuilder searchRequestBuilder = client.prepareSearch("index1", "index2")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(QueryBuilders.termQuery("multi", "test"))
.setPostFilter(QueryBuilders.rangeQuery("age").from(12).to(18))
.setFrom(0).setSize(60).setExplain(true);
调用searchRequestBuilder.toString()会导致此查询的完整JSON表示形式:
{"from":0,"size":60,"query":{"term":{"multi":{"value":"test","boost":1.0}}},"post_filter":{"range":{"age":{"from":12,"to":18,"include_lower":true,"include_upper":true,"boost":1.0}}},"explain":true}