我有同义词: lake loch当我在postgres中做fts时,我想得到所有包含‘file’,' lac‘和'loch’的单词(我用同义词作为.syn文件或.rules文件)。然而,我也想得到“湖”开头的单词,比如“湖田”。如果我用同义词,我没有前缀匹配,当我不使用同义词时,我得到前缀匹配.我怎么能两者兼得?有没有一种关闭同义词的方法,所以我做了一个问题来获得同义词,而另一个忽略了它们?我试过“喜欢”和“位置”,但太慢了。
.rules有:莱克湖、湖湖、紫胶湖、湖湖
.syn有:。
我两次都试了,但问题是一样的。如果我在.syn文件中将所有同义词映射到其中一个:莱克湖洛奇湖
..。我会得到'lakefield‘,但不是'lacombe’(我需要他们所有的工作前缀)。
我使用的是PostgreSQL 9.3。
查询是:
select
*,
ts_rank_cd(to_tsvector('location', name), to_tsquery('location', 'lac:*'),16) as ftsrank
from profile_name
where iso_code='en-CA'
AND to_tsvector('location', name) @@ to_tsquery('location', 'lac:*')
AND ts_rank_cd(to_tsvector('location', name), to_tsquery('location', 'lac:*'),16) >= 0
order by ftsrank desc profile表有一个要搜索的name字段。
谢谢你,佐里卡
发布于 2014-08-06 14:01:19
这就是我解决问题的方法:我添加了一个新的fts (全文搜索)配置,它不使用同义词,并在to_tsquery中引用要搜索的关键字用户上的那个配置。对于上面的例子,如下所示:
select
*,
ts_rank_cd(to_tsvector('location', name), to_tsquery('location_nosyn', 'lac:*'),16) as ftsrank
from profile_name
where iso_code='en-CA'
AND to_tsvector('location', name) @@ to_tsquery('location_nosyn', 'lac:*')
AND ts_rank_cd(to_tsvector('location', name), to_tsquery('location_nosyn', 'lac:*'),16) >= 0
order by ftsrank desc ..。其中提到了不识别同义词的fts配置。请注意,对于数据库字段“name”,我仍然使用同义词,因此它将从db获取所有同义词。但是,不为关键字使用同义词会使部分匹配正常工作(如果用户输入'lac‘,他们会得到类似于'Lake’的同义词词,但是他们也会得到'Lacey‘而不是'Lakewood’.这正是我所需要的)。
希望这能帮助其他人解决类似的问题。感谢每一个回复的人!
发布于 2014-08-01 01:33:27
您可以不使用查询重写功能吗?
select
ts_rewrite('lake'::tsquery, 'lake'::tsquery, 'lake:* | lac | loch'::tsquery) @@ 'lake'::tsvector, --true
ts_rewrite('lake'::tsquery, 'lake'::tsquery, 'lake:* | lac | loch'::tsquery) @@ 'loch'::tsvector, --true
ts_rewrite('lake'::tsquery, 'lake'::tsquery, 'lake:* | lac | loch'::tsquery) @@ 'lakefield'::tsvector --true您也可以将查询重写保存在数据库表中。
https://stackoverflow.com/questions/24460151
复制相似问题