添加前缀匹配到pg_search



我正在关注Railscasts的这一集。

如果我搜索"Kerber",它会返回正确的文章。但如果我搜索"Ke",它不会返回同一篇文章。

有办法修复这个吗?

class Item < ActiveRecord::Base
  include PgSearch
  pg_search_scope :search, against: [:description, :about, :link, :twitterhandle, :builtby],
  using: {tsearch: {dictionary: "english"}}
  def self.text_search(query)
    if query.present?
      search(query)
    else
      scoped
    end
  end

我是pg_search的作者和维护者。

您可以将prefix: true添加到:tsearch搜索特性的配置中,以使pg_search自动将:*添加到查询的末尾。

https://github.com/Casecommons/pg_search前缀- postgresql - 84和-新

class Item < ActiveRecord::Base
  include PgSearch
  pg_search_scope :search, against: [:description, :about, :link, :twitterhandle, :builtby],
  using: {tsearch: {prefix: true, dictionary: "english"}}
  def self.text_search(query)
    if query.present?
      search(query)
    else
      scoped
    end
  end
end

这个结果对我来说是有意义的。KeKerber是不同的词,所以在全文搜索中不匹配。

全文搜索只执行词干提取—删除复数等—以便cats匹配cat。即使这样也不是很聪明——像dice这样的非典型复数也没有处理。它也只适用于目标语言字典中识别的单词,所以即使KerberKe的复数形式,当语言设置为english时,它也不会被阻止。

参见tsquery和tsvectors:

regress=> SELECT to_tsvector('Kerber'), to_tsquery('Kerber'), to_tsvector('ke'), to_tsquery('ke');
 to_tsvector | to_tsquery | to_tsvector | to_tsquery 
-------------+------------+-------------+------------
 'kerber':1  | 'kerber'   | 'ke':1      | 'ke'
(1 row)

和匹配项:

regress=> SELECT to_tsvector('Kerber') @@ to_tsquery('Kerber'), to_tsvector('kerber') @@ to_tsquery('ke');
 ?column? | ?column? 
----------+----------
 t        | f                                                                                                                                                                  
(1 row)        

我怀疑你想要一个搜索前缀匹配。这用:*通配符表示:

regress=> SELECT to_tsvector('kerber') @@ to_tsquery('ke:*');
 ?column? 
----------
 t
(1 row)

这个只有适用于前缀匹配。它可以对搜索效率产生影响,但我不认为这是一个主要的影响。

相关内容

  • 没有找到相关文章

最新更新