Добавление соответствия префикса в 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)

Это работает только для сопоставления префиксов. Это может повлиять на эффективность поиска, но я не думаю, что это главное.

Другие вопросы по тегам