Добавление префикса для поиска ПГ


Я следую за этим эпизодом железнодорожных передач.

Если я ищу "Кербер", он возвращает правильный артикль. Но если я ищу "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 3

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)

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