Добавление префикса для поиска ПГ
Я следую за этим эпизодом железнодорожных передач.
Если я ищу "Кербер", он возвращает правильный артикль. Но если я ищу "Ke", он не возвращает ту же статью.
Есть способ это исправить?
class Item < ActiveRecord::Base
include PgSearch
pg_search_scope :search, against: [:description, :about, :link, :twitterhandle, :builtby],
using: {tsearch: {dictionary: "english"}}
def self.text_search(query)
if query.present?
search(query)
else
scoped
end
end
2 ответа:
Я автор и сопровождающий pg_search.
Вы можете добавить
prefix: true
в конфигурацию для функции поиска:tsearch
, чтобы pg_search автоматически добавлял:*
в конец ваших запросов.Https://github.com/Casecommons/pg_search#prefix-postgresql-84-and-newer-only
class Item < ActiveRecord::Base include PgSearch pg_search_scope :search, against: [:description, :about, :link, :twitterhandle, :builtby], using: {tsearch: {prefix: true, dictionary: "english"}} def self.text_search(query) if query.present? search(query) else scoped end end end
Этот результат имеет для меня смысл.
Ke
иKerber
-это разные слова, поэтому они не совпадают в полнотекстовом поиске.Полнотекстовый поиск делает толькостемминг -удаление множественных чисел и т. д. - Так что
cats
совпадает сcat
. Даже это не совсем умно - нетипичные множественные числа, такие какdice
, не обрабатываются. Он также работает только для слов, распознанных в словаре целевого языка, поэтому, даже еслиKerber
было множественным числомKe
, он не был бы связан, когда язык установлен вenglish
.Смотрите tsquery и tsvectors:
regress=> SELECT to_tsvector('Kerber'), to_tsquery('Kerber'), to_tsvector('ke'), to_tsquery('ke'); to_tsvector | to_tsquery | to_tsvector | to_tsquery -------------+------------+-------------+------------ 'kerber':1 | 'kerber' | 'ke':1 | 'ke' (1 row)
И спички:
regress=> SELECT to_tsvector('Kerber') @@ to_tsquery('Kerber'), to_tsvector('kerber') @@ to_tsquery('ke'); ?column? | ?column? ----------+---------- t | f (1 row)
Я подозреваю, что вы хотитесовпадение префикса tsearch . Это выражается с помощью подстановочного знака
:*
:regress=> SELECT to_tsvector('kerber') @@ to_tsquery('ke:*'); ?column? ---------- t (1 row)
Это только работает для сопоставления префиксов. Это может повлиять на эффективность поиска, но я не думаю, что это серьезно.