使用Ruby on Rails在文本搜索中处理特殊字符

问题描述 投票:0回答:1

我正在尝试在应用程序中实现特定的搜索,但遇到了一些麻烦。

我希望搜索的第一个结果包含所搜索的词组,而不是仅包含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

提前感谢!

ruby-on-rails postgresql search full-text-search
1个回答
0
投票

您可以在您的排序表达式中添加条件,检查名称是否以搜索词开头,然后首先对这些结果进行排序(即(作为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

© www.soinside.com 2019 - 2024. All rights reserved.