Добавление соответствия префикса в pg_search
Я слежу за этим эпизодом Railscasts.
Если я ищу "Kerber", он возвращает правильную статью. Но если я ищу "Ке", он не возвращает ту же статью.
Есть способ это исправить?
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
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)
Это работает только для сопоставления префиксов. Это может повлиять на эффективность поиска, но я не думаю, что это главное.