在Elasticsearch 2.x中,我们使用source(Map)
来初始化SearchRequest
的来源:
SearchRequest searchRequest = new SearchRequest();
searchRequest.source((Map<?,?>) request.get("search_request"));
在Elasticsearch 5中,所有source(...)
方法都消失了,取而代之的是SearchSourceBuilder
。记录了很多。
但我如何将Map
转换为SearchSourceBuilder
?那里似乎没有任何有用的工厂方法,我已经搜索了其他采用Map
的方法,但似乎没有任何方法可以跳出来。
答案 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));