我一直在摆弄 pg_search。使用 tsearch,我成功地设置了字典搜索和前缀搜索。但是,如果我按字典术语搜索,它也不会产生前缀搜索的结果。我想知道是否有办法让它们同时工作。
例如,我的字典中的一行看起来像这样:
小麦谷物食品面包
如果我搜索“面包”,所有标题为“小麦”“谷物”“食物”或“面包”的内容都会出现。
但是如果我有一个标题为“breadman”的项目,它应该在搜索“bread”时出现,因为前缀搜索是正确的。但除非我删除字典或输入部分单词,如“brea”或“breadma”,否则不会。
参考代码:
pg_search_scope :search_title, lambda { |query, params|
{
query: query,
against: :title,
using: {
tsearch: {
dictionary: 'english', prefix: true
}
}
}
如上所述,我尝试过让字典和前缀同时工作。但是,如果搜索字典项,则前缀似乎不起作用。
我不知道pg_search在做什么,但你可以使用同义词词典。
在 PostgreSQL“共享”目录的
mysyn.syn
子目录中创建一个文件tsearch_data
,其中包含
wheat bread
grain bread
food bread
创建同义词词典:
CREATE TEXT SEARCH DICTIONARY mysyn (
TEMPLATE = synonym,
SYNONYMS = mysyn
);
创建文本搜索配置:
CREATE TEXT SEARCH CONFIGURATION mycf (COPY = english);
ALTER TEXT SEARCH CONFIGURATION mycf
ALTER MAPPING FOR asciiword WITH mysyn, english_stem;
这应该可以按照前缀搜索的要求工作:
SELECT to_tsvector('mycf', 'food') @@ to_tsquery('mycf', 'bread:*');
?column?
══════════
t
(1 row)
SELECT to_tsvector('mycf', 'breadbox') @@ to_tsquery('mycf', 'bread:*');
?column?
══════════
t
(1 row)