Postgresql:将相似性与 tsvector 相结合

dkn*_*ack 5 postgresql

我有一个包含超过 5000 万条记录的数据库表,我需要尽快对其进行全文搜索。

在较小的表上,我只在文本列上有一个索引,然后使用相似性函数来获得相似的结果。我还可以根据相似度()的结果进行排序。

现在,在我的桌子变得更大之后,我切换到 tsvector。我为 tsvector 结果创建了一列,并创建了一个触发器,该触发器在插入或更新之前更新该列。之后我可以超快地搜索(<100ms)。

问题是我想结合使用 tsvector 和相似度。

例子

我的表包含以下数据。

| MyColumn |
------------
| Apple    |
| Orange   |
| ...      |
Run Code Online (Sandbox Code Playgroud)

但如果我搜索“App”,我不会得到“Apple”。

关于如何使用“分数/相似性”分数进行快速“喜欢/相似”搜索有什么想法吗?

Vao*_*sun 0

https://www.postgresql.org/docs/current/static/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES

此外,* 可以附加到词位以指定前缀匹配:

是这样吗?:

postgres=# with c(v) as (values('Apple'),('App'),('application'),('apricote'))
select v,to_tsvector(v),to_tsvector(v) @@ to_tsquery('app:*') from c;
      v      | to_tsvector | ?column?
-------------+-------------+----------
 Apple       | 'appl':1    | t
 App         | 'app':1     | t
 application | 'applic':1  | t
 apricote    | 'apricot':1 | f
(4 rows)

postgres=# with c(v) as (values('Apple'),('App'),('application'),('apricote'))
select v,to_tsvector(v),to_tsvector(v) @@ to_tsquery('ap:*') from c;
      v      | to_tsvector | ?column?
-------------+-------------+----------
 Apple       | 'appl':1    | t
 App         | 'app':1     | t
 application | 'applic':1  | t
 apricote    | 'apricot':1 | t
(4 rows)
Run Code Online (Sandbox Code Playgroud)