我正在尝试在应用程序中实现特定的搜索,但遇到了一些麻烦。
我希望搜索的第一个结果包含所搜索的词组,而不是仅包含first。
例如,如果我在应用程序中搜索零件,则会得到以下结果:
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
。
提前感谢!
您可以在您的排序表达式中添加条件,检查名称是否以搜索词开头,然后首先对这些结果进行排序(即(作为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