使用pg_search进行子字符串搜索

8
我正在使用 pg_search 进行产品搜索:
class Product
  include PgSearch

  pg_search_scope(
    :search_for,
    against: %i(sku),
    associated_against: { translations: [:name, :description] },
    using: { tsearch: { prefix: true } }
  )
end

这个功能目前运作良好。但我想添加一个选项,可以搜索部分关键词,这样客户就可以通过输入“45678”来找到具有sku“123456789”的产品。使用LIKE很容易实现,但是我找不到将其与pg_search结合起来的方法,以便结果可以组合和排名。
如何让pg_search通过部分字符串查找产品?

据我在使用pg_search工具的经验,你可以传递选项prefix: true来实现此功能。你可以尝试使用trigram而不是tsearch,因为它会通过字母三元组进行搜索,而不是整个字符串。 - uno_ordinary
3
prefix:true只会查找前缀,因此对于数字12345,使用前缀为123的搜索可以匹配成功,但使用前缀为234的搜索则无法匹配成功。 - csch
@csch,我现在也遇到了同样的问题。你找到解决方案了吗?如果你找到了任何解决方案,请帮帮我。 - anusha
@anusha 很抱歉,这已经是将近4年前的事了,我不记得当时是如何解决问题的。而且我现在也不能访问代码库,所以无法查找 :-/ - csch
@csch 好的,谢谢您的确认。 - anusha
1个回答

0

PostGres的pg_trgm扩展可以让您在字符串内进行模糊搜索,只需将其word_similarity属性设置为true即可。

  1. 生成迁移
    rails g migration AddPgTrgmExtensionToDB
  • 迁移文件
  •     class AddPgTrgmExtensionToDb < ActiveRecord::Migration[7.0]
          def change
            enable_extension 'pg_trgm'
          end
        end
    

    定义您的PG搜索范围,如pg_search文档所述。
        pg_search_scope :search_for, against: :sku, using: { trigram: { word_similarity: true } }
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接