Как сопоставить неполные термины в Elasticsearch с помощью Searchkick?

Я использую Elasticsearch + Searchkick в своем приложении Rails для индексации статей. Когда я ищу по неполным словам, это не работает. Например:

Article.search('feature compatibility').pluck(:name)
# => ["Feature compatibility by mobile device"]

Article.search('feature compatibil').pluck(:name)
# => []

В моей модели используются настройки Searchkick по умолчанию.


person Diego    schedule 17.04.2017    source источник
comment
Вам нужно добавить searchkick text_start: [:attribute_name] в вашу модель   -  person Dnyanarth lonkar    schedule 17.04.2017
comment
а затем запустите это на консоли rails Article.reindex, чтобы добавить данные в поисковый индекс.   -  person Dnyanarth lonkar    schedule 17.04.2017
comment
@Dnyanarthlonkar пробовал, но безуспешно.   -  person Diego    schedule 17.04.2017
comment
@Diego Вы прошли через это: github.com/ankane/searchkick#instant-search --автозаполнение ?   -  person Val    schedule 17.04.2017
comment
@Diego, пожалуйста, перейдите по ссылке, вставленной Вэлом, вам также необходимо включить typehead.js для автозаполнения поиска.   -  person Dnyanarth lonkar    schedule 17.04.2017
comment
Я не использую это для автозаполнения. Я попробовал это @Val: searchkick text_start: [:name, :body], а затем переиндексировал. Поиск feature compatibil по-прежнему не дает результатов. Поиск feature compatibility подходит.   -  person Diego    schedule 17.04.2017
comment
Поиск feature compatibil (то есть части слова) очень похож на автозаполнение. Вместо этого вы можете попробовать match_phrase_prefix, т.е. Article.search body: {match_phrase_prefix: {name: "feature compatibil"}}   -  person Val    schedule 17.04.2017
comment
@Val, этот код дает мне failed to parse search source. unknown search element [match_phrase_prefix]. Необходимость изменить поведение по умолчанию звучит неправильно для меня. Если я ищу feature, появляется статья, если я набираю feature co, эта статья больше не соответствует. Это звучит очень нелогично. Я не могу быть единственным, кто должен изменить это поведение. Или я что-то не так делаю. Необработанные запросы Elasticsearch, используемые для обработки этих случаев, если я не ошибаюсь.   -  person Diego    schedule 17.04.2017
comment
Он не находит co, потому что feature compatibility по умолчанию индексируется в feature и compatibility, то есть вы вообще не индексируете ngrams. match_phrase_prefix — единственный запрос, который даст вам то, что вы хотите, не вдаваясь в ngram-обработку ваших данных.   -  person Val    schedule 17.04.2017
comment
@Val, если это так, почему Article.search('featu') работает?   -  person Diego    schedule 18.04.2017
comment
Вы не упомянули об этом, или я как-то пропустил это.   -  person Val    schedule 18.04.2017
comment
Давайте продолжим обсуждение в чате.   -  person Diego    schedule 18.04.2017


Ответы (1)


Сначала добавьте это в свою модель (word_start, а не text_start)

searchkick word_start: [:name, :body]

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

person Val    schedule 18.04.2017
comment
Рад, что это помогло! - person Val; 18.04.2017