带子字符串的PostgreSQL全文搜索
我正在尝试创建一种最快的方法,在PostgreSQL(9.4版)中通过多列搜索数百万条记录 我想尝试使用标准的PostgreSQL,而不是Solr等 我目前正在测试全文搜索 这是可行的,但我希望有更灵活的搜索方式 目前,如果我有一个包含ex.“Volvo”和一个包含“Blue”的列,我可以找到搜索字符串为“Volvo Blue”的记录,但我也希望使用“Volvo blu”查找记录,就像我使用like和“%blu%”一样带子字符串的PostgreSQL全文搜索,sql,postgresql,full-text-search,Sql,Postgresql,Full Text Search,我正在尝试创建一种最快的方法,在PostgreSQL(9.4版)中通过多列搜索数百万条记录 我想尝试使用标准的PostgreSQL,而不是Solr等 我目前正在测试全文搜索 这是可行的,但我希望有更灵活的搜索方式 目前,如果我有一个包含ex.“Volvo”和一个包含“Blue”的列,我可以找到搜索字符串为“Volvo Blue”的记录,但我也希望使用“Volvo blu”查找记录,就像我使用like和“%blu%”一样 使用全文搜索可以吗?这样做的唯一选项是使用contrib模块 这使您能够创建
使用全文搜索可以吗?这样做的唯一选项是使用contrib模块 这使您能够创建一个GIN或GiST索引,对三个字符的所有序列进行索引,该索引可用于使用相似性运算符
%
进行搜索
注二:
%
运算符可能会返回“假阳性”结果,因此请务必添加第二个条件(例如,使用类似的)以消除这些条件
如果这还不足以满足您的需要,您将不得不求助于第三方解决方案。这样的解决方案的唯一选择是使用contrib模块 这使您能够创建一个GIN或GiST索引,对三个字符的所有序列进行索引,该索引可用于使用相似性运算符
%
进行搜索
注二:
%
运算符可能会返回“假阳性”结果,因此请务必添加第二个条件(例如,使用类似的)以消除这些条件
如果这还不足以满足您的需要,您将不得不求助于第三方解决方案。FTS有前缀匹配功能,但一般来说,它的设计并不能有效地实现这一点。FTS的设计目标是查找词素匹配(和
blu
与blue
不匹配,但是f.ex.volvo
、volvos
和volvo的
都是)。--如果你能升级到9.6,那么pg_trgm
有一个很好的新特性:单词相似性,这可能会处理你的用例。9.6还增加了对“短语搜索”(多个相邻单词)的支持在FTS.Or中,作为替代解决方案,您可以分两步进行搜索:第一步,您需要搜索每个单词的拼写错误(pg_trgm
),在找到匹配项后,您可以在第二步为最终用户提供搜索这些拼写错误的可能性(类似于f.ex.谷歌在拼写错误时的处理方式).FTS有前缀匹配功能,但一般来说,它的设计并不是为了有效地进行前缀匹配。FTS的设计是围绕查找词素匹配而进行的(而且blu
与blue
不是匹配,而是f.ex.volvo
,volvos
和volvo的
是匹配)——如果您可以升级到9.6,那么pg_trgm
中有一个很好的新功能:单词相似性,这可能会处理您的用例。9.6还增加了对FTS中“短语搜索”(多个相邻单词)的支持。或者,对于替代解决方案,您可以分两步进行搜索:第一步,您需要搜索每个单词的拼写(pg_trgm
在这方面尤其出色)。找到匹配项后,您可以让最终用户在第二步中搜索这些匹配项(类似于f.ex.谷歌在拼写错误时的处理方式)。他们的示例主要显示在一列中只搜索一个单词。我如何在多个列中搜索多个单词?您可以在连接的列上使用单个%
运算符(col1 | |'''.| col2%'searchstring'
),也可以使用多个%
比较,并与和(col1%'searchstring'和col2%'searchstring'
)。它们的示例主要显示在一列中只搜索一个单词。如何在多个列中搜索多个单词?您可以对串联列使用单个%
运算符(col1 |'.| col2%'searchstring'
)或者使用几个%
比较与和
(col1%'searchstring'和col2%'searchstring'
)。