SearchKick переиндексирует, но поиск не работает, если не задано полное слово - PullRequest
0 голосов
/ 25 октября 2018

У меня есть модель Artist с

def search_data
  {
    name: name,
    description: description
  }
end

Я создаю двух художников

Artist.create(name: "Da Vinci", description: "Tortuga")
Artist.create(name: "Donatello", description: "Tortoise")

Затем переиндексирую их

Artist.reindex

Выполните общий поиск

Artist.search("*").results

Возвращает

=> [#<Artist id: 295, name: "Donatello", description: "Tortuga", avatar: nil, cover: nil, created_at: "2018-10-25 13:43:21", updated_at: "2018-10-25 13:43:21">, #<Artist id: 296, name: "Da Vinci", description: "Tortuga", avatar: nil, cover: nil, created_at: "2018-10-25 13:43:52", updated_at: "2018-10-25 13:43:52">]

Итак, я делаю вывод, что художники правильно проиндексированы, я делаю поиск

Artist.search("D").results

Но он возвращает только

=> [#<Artist id: 296, name: "Da Vinci", description: "Tortuga", avatar: nil, cover: nil, created_at: "2018-10-25 13:43:52", updated_at: "2018-10-25 13:43:52">]

Единственный способ добраться до Донателло без поиска "*" - это буквально

Artist.search("Donatello").results

Возвращает

=> [#<Artist id: 295, name: "Donatello", description: "Tortuga", avatar: nil, cover: nil, created_at: "2018-10-25 13:43:21", updated_at: "2018-10-25 13:43:21">]

Чего мне не хватает?Заранее спасибо.

- UDAPTE -

Я хочу буквально выполнить этот запрос

search("*", page: page, per_page: per_page, where: { _or: [ { name: /.*#{query}.*/ }, { description: /.*#{query}.*/ } ] })

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Был ответ, который был правильным, но неполным.Решением было использование Partial Matches, в моем случае match:: text_middle

Единственное, чего не хватало, мне пришлось изменить свою модель, чтобы использовать text_middle

searchkick callbacks: :async, text_middle: [:name, :description]

и поисковый запросдо

Artist.search("D", match: :text_middle).results
0 голосов
/ 25 октября 2018

Взгляните на:

Частичные совпадения

По умолчанию результаты должны соответствовать всем словам в запросе.

ruby Product.search "fresh honey" # fresh AND honey

Чтобы изменить это, используйте:

ruby Product.search "fresh honey", operator: "or" # fresh OR honey

По умолчанию результаты должны соответствовать всему слову - back не будет соответствовать backpack.Вы можете изменить это поведение с помощью:

ruby class Product < ApplicationRecord searchkick word_start: [:name] end

И для поиска (после переиндексации):

ruby Product.search "back", fields: [:name], match: :word_start

Доступные варианты:

Опция |Матчи |Пример --- |--- |--- :word |все слово |apple совпадений apple :word_start |начало слова |app совпадений apple :word_middle |любая часть слова |ppl совпадений apple :word_end |конец слова |ple совпадений apple :text_start |начало текста |gre соответствует green apple, app не соответствует :text_middle |любая часть текста |een app совпадений green apple :text_end |конец текста |ple соответствует green apple, een не соответствует

По умолчанию :word.Большинство совпадений произойдет с :word_middle.

...