Я использую гем pg_search в приложении Rails для поиска пользователей — их биографий и связанной с ними модели навыков. Пользователи являются разработчиками, поэтому их навыки включают в себя такие вещи, как «CSS», «C++», «C#», «Objective C» и т. д.
Первоначально я использовал следующую область поиска:
pg_search_scope :search,
against: [:bio],
using: {tsearch: {dictionary: "english", prefix: true}},
associated_against: {user: [:fname, :lname], skills: :name}
Однако, если вы будете искать «C++» в этом случае, вы получите результаты, включающие «CSS» (среди прочего). Я изменил область действия, чтобы использовать «простой» словарь, и удалил префикс:
pg_search_scope :search_without_prefix,
against: [:bio],
using: {tsearch: {dictionary: "simple"}},
associated_against: {user: [:fname, :lname], skills: :name}
Это исправило некоторые вещи — например, поиск «C++» не показывает «CSS». Но поиск «C++» или «C#» по-прежнему соответствует пользователям, у которых в списке есть «C» или «Objective C».
Я определенно могу выполнить базовое сопоставление ILIKE
, но надеюсь сделать это с помощью pg_search, если это возможно.