为什么此postgresql全文搜索查询返回的ts_秩为0?
在我投资使用solr、lucene或sphinx之前,我想尝试使用postgresql全文搜索在我的系统上实现搜索功能 我有一个全国性的企业列表,在一个表中,我想搜索。我创建了一个ts向量,它结合了企业名称和城市,这样我就可以进行类似“内陆亚特兰大”的搜索 我还通过使用搜索的通配符功能实现了一个自动完成功能,在搜索模式中添加“:”并在关键字之间插入“&”,因此搜索模式“outback atl”在转换为使用to_tsquery()的查询之前会变成“outback&atl:” 这是我目前遇到的问题。 如果搜索模式输入为“ou”,将返回许多“Outback Steakhouse”记录。 如果搜索模式输入为“out”,则不会返回任何结果。 如果搜索模式输入为“outb”,则返回许多“Outback Steakhouse”记录 在进行一点调试后,我得出以下结论:为什么此postgresql全文搜索查询返回的ts_秩为0?,postgresql,full-text-search,fuzzy-search,tsvector,Postgresql,Full Text Search,Fuzzy Search,Tsvector,在我投资使用solr、lucene或sphinx之前,我想尝试使用postgresql全文搜索在我的系统上实现搜索功能 我有一个全国性的企业列表,在一个表中,我想搜索。我创建了一个ts向量,它结合了企业名称和城市,这样我就可以进行类似“内陆亚特兰大”的搜索 我还通过使用搜索的通配符功能实现了一个自动完成功能,在搜索模式中添加“:”并在关键字之间插入“&”,因此搜索模式“outback atl”在转换为使用to_tsquery()的查询之前会变成“outback&atl:” 这是我目前遇到的问题。
select ts_rank(to_tsvector('Outback Steakhouse'),to_tsquery('ou:*')) as "ou",
ts_rank(to_tsvector('Outback Steakhouse'),to_tsquery('out:*')) as "out",
ts_rank(to_tsvector('Outback Steakhouse'),to_tsquery('outb:*')) as "outb"
其结果是:
ou out outb
0.0607927 0 0.0607927
我做错了什么
这是pg全文搜索的限制吗
我是否可以通过我的字典或配置来绕过这个异常
更新:
我认为“出去”可能是一个停止词
当我运行这个调试查询时,我没有得到任何“out”的词素
所以现在我问我如何修改停止词列表来删除一个词
更新:
以下是我当前使用的查询:
select id,name,address,city,state,likes
from view_business_favorite_count
where textsearchable_index_col @@ to_tsquery('simple',$1)
ORDER BY ts_rank(textsearchable_index_col, to_tsquery('simple',$1)) DESC
当我执行查询时(我使用的是Strongloop Loopback+Express+Node),我传入模式以替换$1参数。该模式(如上所述)看起来类似于“关键字:”或“关键字1和关键字2&…和关键字n:”
谢谢这里的问题是,您正在搜索企业名称,正如@Daniel正确指出的-
'english'
字典不会帮助您找到“Outback Steakhouse”等非字典单词的“模糊”匹配
'simple'
字典
'simple'
词典本身对您也没有帮助,在您的情况下,企业名称只适用于精确匹配,因为所有单词都是未排序的
'simple'
dictionary+pg\u trgm
但是,如果您将'simple'
字典与模块一起使用,它将正是您所需要的,特别是:
- 对于
你不需要担心停止词“hack”,你将得到所有的词素李>to_tsvector('simple','')
- 使用
从similarity()
获得最高的“等级” 为了最好的比赛pg\u trgm
WITH pg_trgm_test(business_name,search_pattern) AS ( VALUES
('Outback Steakhouse','ou'),
('Outback Steakhouse','out'),
('Outback Steakhouse','outb')
)
SELECT business_name,search_pattern,similarity(business_name,search_pattern)
FROM pg_trgm_test;
结果:
business_name | search_pattern | similarity
--------------------+----------------+------------
Outback Steakhouse | ou | 0.1
Outback Steakhouse | out | 0.15
Outback Steakhouse | outb | 0.2
(3 rows)
按相似性排序DESC
您将能够得到您所需要的
更新
对于您的情况,有两种可能的选择
选项1。
只需为view\u business\u favorite\u count
表中的name
列创建trgm索引;索引定义可以如下所示:
CREATE INDEX name_trgm_idx ON view_business_favorite_count USING gin (name gin_trgm_ops);
查询将如下所示:
SELECT
id,
name,
address,
city,
state,
likes,
similarity(name,$1) AS trgm_rank -- similarity score
FROM
view_business_favorite_count
WHERE
name % $1 -- trgm search
ORDER BY trgm_rank DESC;
选项2。
使用全文搜索,您需要:
- 创建一个单独的表,例如
,在其中存储两列:第一列将保留unnested\u business\u names
函数中的所有词素,第二列将具有to\u tsvector('simple',name)
(FK表示查看的vbfc\u id
id
最喜爱的\u count表)李>
- 为包含词素的列添加
索引李>trgm
- 为
添加触发器,该触发器将更新或插入或删除unested\u business\u names
中的新值,以使所有单词保持最新view\u business\u favorite\u count
- 为包含词素的列添加
simple
而不是english
作为配置?我确实切换到simple而不是english,以在过渡期间实现此功能。我只是用实际查询更新了问题。如何将三角模糊搜索与全文搜索结合起来?
SELECT
id,
name,
address,
city,
state,
likes,
similarity(name,$1) AS trgm_rank -- similarity score
FROM
view_business_favorite_count
WHERE
name % $1 -- trgm search
ORDER BY trgm_rank DESC;