Я использую абстракцию Searchkick для нашей реализации Elasticsearch.
Это конфиг:
searchkick(
word_middle: [:name],
suggest: [:name],
searchable: [:name],
synonyms: -> { CSV.read("app/lib/club_and_team_search_synonyms.csv") },
callbacks: :async,
)
Вот запрос
Searchkick.search(
query,
index_name: [Club, Team],
fields: [:name],
match: :word_middle,
operator: "or",
limit: 50,
where: { country_id: country_id, hide_in_search: false },
track: track_search,
)
Хорошо, проблема в том, что я хочу найти следующий клуб с именем Saint Jean d Angely
Если я ищу Saint Jean d Angely
, он возвращается нормально, и если также отлично работает с Saint Jean dAngely
, но получает немного меньшую оценку.
Однако, если я ищу так:Saint Jean d'Angely
он получает очень низкий балл, следовательно, многие другие клубы получают более высокий балл, даже если они выглядят намного хуже - я знаю, что это также частично связано с использованием n-грамм, но все еще трудно понять,как оценка стала намного ниже.
Индекс поиска word_middle
использует ascii_folding
позади сцены между прочим, так как лучше всего обрабатывать подобные вещи?
Должен ли я вырезать специальные символы перед выполнением запроса,так как я уже обрабатываю специальные символы в индексе или есть более оптимальный способ?