2017-01-20 6 views
0

В Elasticsearch 2.x, мы использовали source(Map) инициализацию источник SearchRequest «s:Как преобразовать карту в SearchSourceBuilder?

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

В Elasticsearch 5, все source(...) методы ушли, заменены на один с SearchSourceBuilder. Это многое документировано.

Но как преобразовать Map в SearchSourceBuilder? Там, кажется, нет каких-либо полезных заводских методов, и я уже изучал другие методы, принимая Map, и ничто, кажется, не выпрыгивает.

ответ

1

Проблема, которую вы выделили 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)); 
+0

Я в порядке с переключением на источник (SearchSourceBuilder) ... но все, что я получил это Карта, поэтому мне все равно нужно преобразовать это, не так ли? :/ – Trejkaz

+0

Помогло ли это? – Val

+0

Надеюсь получить время, чтобы проверить это сегодня. :) – Trejkaz