gpt4 book ai didi

postgresql - postgres 同义词和前缀结果一起

转载 作者:行者123 更新时间:2023-11-29 13:59:20 30 4
gpt4 key购买 nike

我有同义词: lake lac loch当我在 postgres 中为“lake”做 fts 时,我想获取所有包含“lake”、“lac”和“loch”的词(我使用同义词作为 .syn 文件或 .rules 文件)。但是,我也想获得以“湖”开头的词,例如“湖区”。如果我使用同义词,我不会得到前缀匹配,当我不使用同义词时,我会得到前缀匹配......我怎样才能同时获得两者?有没有一种方法可以关闭同义词,这样我就可以查询同义词并忽略它们?我尝试使用“like”和“position”,但速度太慢了。

.rules 有:紫胶湖湖湖紫胶紫胶湖

.syn 有:湖yyyyy紫胶yyyyy湖 yyyyy

我都试过了,但同样的问题。如果我将所有同义词映射到 .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 字段。

谢谢,佐里卡

最佳答案

我是这样解决问题的:我添加了一个新的 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

... 其中提到“location_nosyn”的 fts 配置不识别同义词。请注意,我仍然对数据库字段“名称”使用同义词,因此它将从数据库中获取所有同义词。但是,不对关键字使用同义词可以保持部分匹配有效(如果用户输入“lac”,他们将得到同义词,如“Lake”,但他们也会得到“Lacey”而不是“Lakewood”……这正是我需要的).

希望这对遇到类似问题的其他人有所帮助。感谢所有回复的人!

关于postgresql - postgres 同义词和前缀结果一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24460151/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com