在 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 ArmWindshield 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

Demo on SQLFiddle