Проблема, которую вы выделили has been reported, но это невозможно больше because of this.
Вы можете прочитать the full story, относящийся к этому большому изменению, но в двух словах в ES 2.x координационный узел (то есть тот, который получает запрос) делегировал разбор запроса на каждый осколок, и не только это было (в основном, циклы ЦП), но также было несколько других недостатков в том, что невозможно оптимизировать запрос в одном месте.
В ES 5 они решили, что координационный узел выполнит синтаксический разбор ONCE, а затем отправит обработанный запрос на каждый осколок. Если вы прочтете сообщение в блоге, с которым я связался, вы увидите, что это должно быть большим улучшением. Конечно, это означает, что вы больше не можете использовать метод SearchRequest.source(Map)
.
UPDATE
original source code The метода source(Map)
выглядел следующим образом:
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));
Я в порядке с переключением на источник (SearchSourceBuilder) ... но все, что я получил это Карта, поэтому мне все равно нужно преобразовать это, не так ли? :/ – Trejkaz
Помогло ли это? – Val
Надеюсь получить время, чтобы проверить это сегодня. :) – Trejkaz