Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么此postgresql全文搜索查询返回的ts_秩为0?_Postgresql_Full Text Search_Fuzzy Search_Tsvector - Fatal编程技术网

为什么此postgresql全文搜索查询返回的ts_秩为0?

为什么此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:” 这是我目前遇到的问题。

在我投资使用solr、lucene或sphinx之前,我想尝试使用postgresql全文搜索在我的系统上实现搜索功能

我有一个全国性的企业列表,在一个表中,我想搜索。我创建了一个ts向量,它结合了企业名称和城市,这样我就可以进行类似“内陆亚特兰大”的搜索

我还通过使用搜索的通配符功能实现了一个自动完成功能,在搜索模式中添加“:”并在关键字之间插入“&”,因此搜索模式“outback atl”在转换为使用to_tsquery()的查询之前会变成“outback&atl:”

这是我目前遇到的问题。 如果搜索模式输入为“ou”,将返回许多“Outback Steakhouse”记录。 如果搜索模式输入为“out”,则不会返回任何结果。 如果搜索模式输入为“outb”,则返回许多“Outback Steakhouse”记录

在进行一点调试后,我得出以下结论:

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'
字典与模块一起使用,它将正是您所需要的,特别是:

  • 对于
    to_tsvector('simple','')
    你不需要担心停止词“hack”,你将得到所有的词素
  • 使用
    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)
    函数中的所有词素,第二列将具有
    vbfc\u id
    (FK表示查看的
    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;