如何根据某些参数动态生成弹性搜索查询

时间:2018-11-09 20:01:00

标签: java elasticsearch

我有一个需要将弹性搜索查询传递给REST端点的要求,如下所示:

{
    query : {
        match_all : {}
    }
}

因此,可以这样说,我正在从UI获取参数。像AND,OR,GroupBy,“要搜索的文本”等。

如何在Java中实现此功能以动态构建查询字符串?

我是弹性搜索的新手,因此请探索产生查询字符串的方式。

任何建议都会有所帮助。

编辑1: 可能是询问上述问题的另一种方式:     如何将“ SearchSourceBuilder”或“ QueryBuilder”转换为Json?

1 个答案:

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