问题描述
|
我正在寻找一种在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。