PostgreSQL能否基于“半个”单词进行全文搜索?例如,我想搜索"tree"
,但是我让postgres搜索"tr"
。
我找不到这样的解决方案。
目前我正在使用
select * from test, to_tsquery('tree') as q where vectors @@ q ;
但我想做类似这样的事情:
select * from test, to_tsquery('tr%') as q where vectors @@ q ;
PostgreSQL能否基于“半个”单词进行全文搜索?例如,我想搜索"tree"
,但是我让postgres搜索"tr"
。
我找不到这样的解决方案。
目前我正在使用
select * from test, to_tsquery('tree') as q where vectors @@ q ;
但我想做类似这样的事情:
select * from test, to_tsquery('tr%') as q where vectors @@ q ;
postgres=# select to_tsvector('tree') @@ to_tsquery('tr:*');
?column?
----------
t
(1 row)
但它只适用于前缀搜索,如果您想在单词的任何位置进行部分匹配,则无法使用。
看起来你只是想要通配符匹配。
一个选项,如先前提到的,是三元组。我的(非常)有限的经验表明,对于我来说,在大型表上速度太慢了(某些情况下甚至比LIKE还慢)。正如我所说,我的三元组经验有限,所以我可能使用不正确。
第二个选项是wildspeed模块:http://www.sai.msu.su/~megera/wiki/wildspeed (你需要构建和安装它)。
第二个选项也适用于后缀/中间匹配。这可能比你所寻找的更多或更少。
有一些注意事项(例如索引的大小),因此请仔细阅读该页面。
select * from test, to_tsquery('tree') as q
where vectors @@ q OR xxxx LIKE ('%tree%')
可以使用三元组来完成,但这不是tsearch2的一部分。
您可以在此处查看手册:http://www.postgresql.org/docs/9.0/interactive/pgtrgm.html
基本上,pg_tgrm
模块的作用是将单词拆分为所有部分,以便可以搜索这些单独的部分。