2015-03-12 2 views
2

Я использую 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 лучших результатов всех документов в отображении завершения, отсортированные по баллам.

ответ

0

Поскольку у вас есть только пустая строка, оценка не может быть вычислена для эксперта по завершению. В этой ситуации нет смысла забивать.

Соответствие всем документам и сортировка в зависимости от веса, вы можете получить десять самых высоких документов в соответствии с весом.

POST my_type/_search 
{ 
    "sort":{"suggest_field_name.weight": {"order": "desc"}} 
} 

Поскольку результаты, вероятно, всегда будут одинаковыми, когда поле ввода пуст, вы можете кэшировать верхние результаты в своем приложении.

+0

С пустой строкой я не ищу оценку, и я не думаю, что вызов _suggest использует оценку в любом случае, она совпадает с древовидной структурой. Поиск был моей второй попыткой, но, как я сказал, я получаю «Нет сопоставления для [keyword_suggest.weight], чтобы сортировать». – Whiskee