ElasticSearch 5.x внедрил некоторые (взломанные) изменения в API-интерфейсе Suggestester (Документация). Наиболее заметным изменением является следующее:
Эксперт по завершению документирования
Предложения знают о к которому они принадлежат. Теперь связанные документы (
_source
) возвращается как часть предложений о завершении.
Короче говоря, все запросы завершения возвращают все сопоставимые документы, а не только сопоставляемые слова. И в этом заключается проблема - дублирование автозаполненных слов, если они встречаются в нескольких документах.
Скажем, мы имеем это простое отображение:
{
"my-index": {
"mappings": {
"users": {
"properties": {
"firstName": {
"type": "text"
},
"lastName": {
"type": "text"
},
"suggest": {
"type": "completion",
"analyzer": "simple"
}
}
}
}
}
}
С несколькими тестовыми документами:
{
"_index": "my-index",
"_type": "users",
"_id": "1",
"_source": {
"firstName": "John",
"lastName": "Doe",
"suggest": [
{
"input": [
"John",
"Doe"
]
}
]
}
},
{
"_index": "my-index",
"_type": "users",
"_id": "2",
"_source": {
"firstName": "John",
"lastName": "Smith",
"suggest": [
{
"input": [
"John",
"Smith"
]
}
]
}
}
И запрос по книге:
POST /my-index/_suggest?pretty
{
"my-suggest" : {
"text" : "joh",
"completion" : {
"field" : "suggest"
}
}
}
Это дает следующие результаты:
{
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"my-suggest": [
{
"text": "joh",
"offset": 0,
"length": 3,
"options": [
{
"text": "John",
"_index": "my-index",
"_type": "users",
"_id": "1",
"_score": 1,
"_source": {
"firstName": "John",
"lastName": "Doe",
"suggest": [
{
"input": [
"John",
"Doe"
]
}
]
}
},
{
"text": "John",
"_index": "my-index",
"_type": "users",
"_id": "2",
"_score": 1,
"_source": {
"firstName": "John",
"lastName": "Smith",
"suggest": [
{
"input": [
"John",
"Smith"
]
}
]
}
}
]
}
]
}
Короче говоря, для предложения о завершении для текста "joh" были возвращены два (2) документа - оба пользователя и оба имели то же значение свойства text
.
Однако я хотел бы получить одно (1) слово. Что-то простое:
{
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"my-suggest": [
{
"text": "joh",
"offset": 0,
"length": 3,
"options": [
"John"
]
}
]
}
Вопрос: как реализовать основанный на словах помощник по завершению. Нет необходимости возвращать какие-либо документы, связанные с данными, поскольку в данный момент мне это не нужно.
Является ли "Завершающий запрос" даже подходящим для моего сценария? Или я должен использовать совершенно другой подход?
ИЗМЕНИТЬ: Как многие из вас указали, дополнительный индекс завершения будет эффективным решением. Однако я вижу несколько проблем с этим подходом:
- Синхронизация нового индекса.
- Автозаполнение последующих слов, вероятно, будет глобальным, а не суженным. Например, скажем, что в дополнительном индексе есть следующие слова:
"John", "Doe", "David", "Smith"
. При запросе"John D"
результат для неполного слова должен быть"Doe"
, а не"Doe", "David"
.
Чтобы преодолеть вторую точку, только индексирование отдельных слов будет недостаточно, так как вам также нужно будет сопоставить все слова с документами, чтобы правильно сузить автозаполнение последующих слов. И при этом у вас есть такая же проблема, как запрос исходного индекса. Поэтому дополнительный индекс больше не имеет смысла.