在 Rails 上使用 Ruby 处理文本搜索中的特殊字符
Dealing with special characters in a text search using Ruby on Rails
我正在尝试在我的应用程序中实现特定搜索,但 运行 遇到了一些麻烦。
我希望搜索结果中的第一个结果包含搜索 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
请注意 Windshield Wiper Arm 如何成为第一个结果,因为它包含搜索参数(就是 "Windshield Wiper")和一个以字母 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
我正在尝试在我的应用程序中实现特定搜索,但 运行 遇到了一些麻烦。
我希望搜索结果中的第一个结果包含搜索 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
请注意 Windshield Wiper Arm 如何成为第一个结果,因为它包含搜索参数(就是 "Windshield Wiper")和一个以字母 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