Я использую Elasticsearch и тип завершения для автозаполнения. Для пустого поиска я хотел бы вернуть десятку документов по всему картографированию (по результату).Elasticsearch Completion - Return top 10 docs по счету
Мое отображение создается так:
String type = AutoCompleteServiceImpl.AC_TYPE;
XContentBuilder mapping = jsonBuilder()
.startObject()
.startObject(type)
.startObject("properties")
.startObject(AutoCompleteServiceImpl.AC_FIELD)
.field("type", "completion")
.endObject()
.endObject()
.endObject()
.endObject();
PutMappingResponse mappingResponse =
client.admin().indices().preparePutMapping(index)
.setType(type).setSource(mapping)
.execute().actionGet();
Где AC_FIELD = "keyword_suggest".
добавить документы по:
XContentBuilder json = jsonBuilder()
.startObject()
.startObject(AC_FIELD)
.array("input", record.getInput().toArray(new String[1]))
.field("output", record.getOutput())
.field("weight", record.getWeight())
.endObject()
.endObject();
elasticsearch.getClient()
.prepareIndex(elasticsearch.getIndexName(), AC_TYPE, record.getId())
.setSource(json)
.execute().actionGet();
Когда пользователь вводит текст (searchTermLC) Я использую предложить вызов, а не поиск (Completion Suggesters). Я звоню так:
CompletionSuggestionBuilder suggestionsBuilder = new CompletionSuggestionBuilder(AC_TYPE);
suggestionsBuilder.field(AC_FIELD);
suggestionsBuilder.text(searchTermLC);
if (limit != null)
suggestionsBuilder.size(limit);
SuggestResponse response =
elasticsearch.getClient()
.prepareSuggest(elasticsearch.getIndexName())
.addSuggestion(suggestionsBuilder)
.execute().actionGet();
Это прекрасно работает для предложений с текстом, но не для пустых предложений.
В своих попытках я попробовал:
- Назначение пустой строки ("") в searchTermLC, но не возвращает параметров.
- Не поставляя текст, чтобы предлагать, но это вызывает в ответе NullPointerException.
- Использование поиска вместо предложения, но поскольку вес не является одним из полей отображения, я не мог сортировать его (Ошибка: «Нет сопоставления для [keyword_suggest.weight] для сортировки»). Сортировка по умолчанию была в алфавитном порядке на выходе.
Я хочу 10 лучших результатов всех документов в отображении завершения, отсортированные по баллам.
С пустой строкой я не ищу оценку, и я не думаю, что вызов _suggest использует оценку в любом случае, она совпадает с древовидной структурой. Поиск был моей второй попыткой, но, как я сказал, я получаю «Нет сопоставления для [keyword_suggest.weight], чтобы сортировать». – Whiskee