匹配以前缀结尾的短语与全文搜索

问题描述

| 我正在寻找一种在PostgreSQL中使用tsvector模拟类似like0的方法。 我没有使用字典就创建了tsvector属性。现在,类似...的查询
SELECT title
FROM table
WHERE title_tsv @@ plainto_tsquery(\'ph:*\');  
...将返回所有标题,例如\'Physics \',\'PHP \'等。但是如何创建一个查询,以返回标题以\'Zend Fram \'开头的所有记录(例如,应返回\'Zend Framework \')? 当然,我可以这样使用:
SELECT title
FROM table
WHERE title_tsv @@ to_tsquery(\'zend\')
AND   title_tsv @@ to_tsquery(\'fram:*\');
但是,这似乎有点尴尬。 因此,问题是:有没有办法使用类似以下的公式来表达上面给出的查询:
SELECT title
FROM table
WHERE title_tsv @@ to_tsquery(\'zend fram:*\');
    

解决方法

        
SELECT title
FROM table
WHERE title_tsv @@ to_tsquery(\'zend\') and
title_tsv @@ to_tsquery(\'fram:*\')  
等效于:
SELECT title
FROM table
WHERE title_tsv @@ to_tsquery(\'zend & fram:*\')
但是当然也可以找到“ Zend没有框架”。 您当然可以在tsquery匹配之后表达一个与标题匹配的正则表达式匹配,但是您必须使用解释分析来确保该查询是在tsquery之后而不是之前执行的。     ,        Postgres 9.6引入了用于全文搜索的短语搜索功能。所以这现在工作:
SELECT title
FROM  tbl
WHERE title_tsv @@ to_tsquery(\'zend <-> fram:*\');
<->
是FOLLOWED BY运算符。 它找到\'foo Zend framework bar \'或\'Zendframes \',但找不到\'foo Zend没有框架bar \'。 引用Postgres 9.6的发行说明:   可以使用新命令在tsquery输入中指定词组搜索查询   运算符
<->
<
N
>
。前者是指之前和之后的词素   它必须按此顺序彼此相邻出现。后者   表示它们之间必须精确地相差
N
。 为了获得最佳性能支持,请使用GIN索引查询:
CREATE INDEX tbl_title_tsv_idx ON tbl USING GIN (title_tsv);
或者根本不在表中存储ѭ14(膨胀它并使写入复杂化)。您可以改用表达式索引:
CREATE INDEX tbl_title_tsv_idx ON tbl USING GIN (to_tsvector(\'english\',title));
您需要指定文本搜索配置(通常是特定于语言的)以使表达式不可变。并相应地调整查询:
...
WHERE to_tsvector(\'english\',title) @@ to_tsquery(\'english\',\'zend <-> fram:*\');
    ,        这不是一个很好的解决方案,但它应该可以完成以下工作:
psql=# SELECT regexp_replace(cast(plainto_tsquery(\'Zend Fram\') as text),E\'(\\\'\\\\w+\\\')\',E\'\\\\1:*\',\'g\') ;
   regexp_replace    
---------------------
 \'zend\':* & \'fram\':*
(1 row)
可以像这样使用:
psql=# SELECT title FROM table WHERE title_tsv(title) @@ to_tsquery(regexp_replace(cast(plainto_tsquery(\'Zend Fram\') as text),\'g\'));
工作原理: 将普通的tsquery转换为字符串::19ѭ 使用正则表达式将
:*
前缀匹配符附加到每个搜索词:
regexp_replace(...,\'g\')
将其转换回非普通tsquery。
to_tsquery(...)
并将其用于搜索表达式
SELECT title FROM table WHERE title_tsv(title) @@ ...
    ,        在Postgres中,有一种方法可以使用Trigram和Gin / Gist索引。在Kristo Kaiv的这篇文章中,有一个简单的示例,但有一些粗糙的地方:Substring Search。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...