如何将地图转换为SearchSourceBuilder?

时间:2017-01-20 01:55:57

标签: java elasticsearch elasticsearch-5

在Elasticsearch 2.x中,我们使用source(Map)来初始化SearchRequest的来源:

SearchRequest searchRequest = new SearchRequest();
searchRequest.source((Map<?,?>) request.get("search_request"));

在Elasticsearch 5中,所有source(...)方法都消失了,取而代之的是SearchSourceBuilder。记录了很多。

但我如何将Map转换为SearchSourceBuilder?那里似乎没有任何有用的工厂方法,我已经搜索了其他采用Map的方法,但似乎没有任何方法可以跳出来。

1 个答案:

答案 0 :(得分:1)

您突出显示问题has been reported,但这不再可能because of this

你可以阅读与这个重大变化有关的the full story,但是用两个词来说,在ES 2.x中,协调节点(即接收查询的节点)会将查询的解析委托给每个分片,而不是只是浪费资源(主要是CPU周期),但也存在一些其他缺点,即无法在一个地方优化查询。

在ES 5中,他们决定协调节点将解析ONCE,然后将解析后的查询发送到每个分片。如果您阅读我链接的博客文章,您会发现这应该是一个很大的改进。当然,这意味着您无法再使用SearchRequest.source(Map)方法了。

<强>更新

source(Map)方法的original source code看起来像这样:

public SearchRequest source(Map source) {
    try {
        XContentBuilder builder = XContentFactory.contentBuilder(Requests.CONTENT_TYPE);
        builder.map(source);
        return source(builder);
    } catch (IOException e) {
        throw new ElasticsearchGenerationException("Failed to generate [" + source + "]", e);
    }
}

没有什么能阻止您在应用程序代码中使用该代码进行转换。

我还没有测试过,但是你应该可以像这样创建一个SearchSourceBuilder

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

// from Map to XContent
XContentBuilder builder = ... // see above
// from XContent to JSON
String json = new String(builder.getBytes(), "UTF-8");
// use JSON to populate SearchSourceBuilder
JsonXContent parser = createParser(JsonXContent.jsonXContent, json));
sourceBuilder.parseXContent(new QueryParseContext(parser));