Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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全文搜索_Sql_Postgresql_Full Text Search - Fatal编程技术网

带子字符串的PostgreSQL全文搜索

带子字符串的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模块 这使您能够创建

我正在尝试创建一种最快的方法,在PostgreSQL(9.4版)中通过多列搜索数百万条记录

我想尝试使用标准的PostgreSQL,而不是Solr等

我目前正在测试全文搜索

这是可行的,但我希望有更灵活的搜索方式

目前,如果我有一个包含ex.“Volvo”和一个包含“Blue”的列,我可以找到搜索字符串为“Volvo Blue”的记录,但我也希望使用“Volvo blu”查找记录,就像我使用like和“%blu%”一样


使用全文搜索可以吗?

这样做的唯一选项是使用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'
    )。