Работа со специальными символами в текстовом поиске с использованием Ruby на Rails - PullRequest
0 голосов
/ 03 апреля 2020

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

Я хочу, чтобы первые результаты в моем поиске содержали фразу, которая была искал сначала , а не просто содержал его.

Например, если я ищу детали в своем приложении, я получаю следующие результаты:

Add-On Windshield Wiper Kit
Turn Signal / Headlight / Windshield Wiper/Washer Combination Lever Set
Turn Signal / Headlight / Windshield Wiper/Washer Combination Switch and Lever Set
Windshield Wiper / Washer Circuit Breaker
Windshield Wiper / Washer Dash Indicator Light
Windshield Wiper Arm

В то время как я пытаюсь достичь чего-то вроде этого:

Windshield Wiper Arm
Windshield Wiper / Washer Circuit Breaker
Windshield Wiper / Washer Dash Indicator Light
Add-On Windshield Wiper Kit
Turn Signal / Headlight / Windshield Wiper/Washer Combination Lever Set
Turn Signal / Headlight / Windshield Wiper/Washer Combination Switch and Lever Set

Обратите внимание на то, как рычаг стеклоочистителя ветрового стекла является первым результатом, поскольку он содержит параметры поиска (который просто "стеклоочиститель ветрового стекла") и последующее слово, которое начинается с буквы A.

В любом случае, вот моя модель :

class Pcdb::Part < CatalogsRecord
  include PgSearch
  self.table_name = "parts"
  belongs_to :parts_description
  pg_search_scope :search_for_parts, against: :part_terminology_name, using: { tsearch: { dictionary: "simple", normalization: 2 } }
end

И соответствующая часть моего контроллера:

Pcdb::Part.where('lower(parts.part_terminology_name) like ?', "%#{search}%").reorder("parts.part_terminology_name ASC")

В данном конкретном случае переменная search равна Windshield Wiper.

Заранее спасибо!

1 Ответ

1 голос
/ 03 апреля 2020

Вы можете добавить условие к своему выражению заказа, проверяя, начинается ли имя с поискового запроса, и сначала упорядочивая эти результаты, т. Е. (Как SQL)

ORDER BY 
    CASE WHEN parts.part_terminology_name LIKE 'Windshield Wiper%' THEN 0 ELSE 1 END,
    parts.part_terminology_name

Если вы хотите получить больше искушенный в упорядочении, вы можете использовать регулярные выражения, чтобы гарантировать, что части с фразой, за которыми следует слово, отсортированное до тех, за которыми следует фраза с последующим символом (т. е. Windshield Wiper Arm перед Windshield Wiper / Washer Circuit Breaker)

ORDER BY 
    CASE WHEN parts.part_terminology_name = 'Windshield Wiper' THEN 0 ELSE 1 END,
    CASE WHEN parts.part_terminology_name ~ '^Windshield Wiper [a-z]' THEN 0 ELSE 1 END,
    CASE WHEN parts.part_terminology_name LIKE 'Windshield Wiper%' THEN 0 ELSE 1 END,
    parts.part_terminology_name

Демонстрация по SQLFiddle

...