我正在关注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
这个结果对我来说是有意义的。Ke
和Kerber
是不同的词,所以在全文搜索中不匹配。
全文搜索只执行词干提取—删除复数等—以便cats
匹配cat
。即使这样也不是很聪明——像dice
这样的非典型复数也没有处理。它也只适用于目标语言字典中识别的单词,所以即使Kerber
是Ke
的复数形式,当语言设置为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)
这个只有适用于前缀匹配。它可以对搜索效率产生影响,但我不认为这是一个主要的影响。