Полный текст Postgres не соответствует частичным словам в Rails 3? - PullRequest
3 голосов
/ 23 февраля 2011

Я только что перешел с MySQL на Postgres 9.0.3. У меня совершенно новое приложение с небольшим количеством данных (игровых данных).

В любом случае, я не могу найти отдельные слова для поиска. Вот мой метод поиска:

def self.search(query)
  conditions = <<-EOS
    to_tsvector('english', title) @@ plainto_tsquery('english', ?)
  EOS

  find(:all, :conditions => [conditions, query])    
end

Я уверен, что мне нужен подстановочный знак, но я только изучаю Postgres.

Когда я ищу Shinobi, я получаю правильные результаты:

Алекс Кидд в мире шиноби - Sega Master System

Shinobi - Sega Master System

Shinobi - Nintendo Entertainment System

Кибер Синоби: Синоби, часть 2 - Система Sega Master

Но когда я ищу Shin, я ничего не получаю?

Спасибо за любые подсказки.

Ответы [ 4 ]

3 голосов
/ 16 декабря 2011

Я думаю, что для разрешения сопоставления префиксов вам нужно использовать to_tsquery вместо plainto_tsquery

, который говорит http://www.postgresql.org/docs/current/static/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES

, чтобы ваш код мог выглядеть примерно так:

def self.search(query)
  conditions = <<-EOS
    to_tsvector('english', title) @@ to_tsquery('english', ?)
  EOS

  find(:all, :conditions => [conditions, query + ':*'])
end
2 голосов
/ 26 апреля 2011

Вы также можете использовать поиск по регулярному выражению, как показано ниже.

find( :all, :conditions => [ 'name ~* ?', "SEARCH TERM" ] )
0 голосов
/ 29 марта 2016

Используйте prefix:

  pg_search_scope :search, against: [:name, :email],
    using: {tsearch: {prefix: true}}
0 голосов
/ 26 мая 2011

Добавьте * к вашей строке запроса.

Поиск Shin*.

def self.search(query)
  conditions = <<-EOS
    to_tsvector('english', title) @@ plainto_tsquery('english', ?)
  EOS

  find(:all, :conditions => [conditions, query.concat("*")])    
end
...