postgresql - 如何在 postgres 中结合全文搜索和 trigrams

标签 postgresql full-text-search trigram

我正在开发一个 git 提交数据库的搜索系统。我目前正在使用全文搜索,使用户能够按作者、提交日期、日志消息和提交哈希进行搜索。目前,只有当用户提供整个提交哈希时,提交哈希才有用,该哈希很长且难以记住,但对于指定单个提交很有用。

查询数据库的查询本质上是这样的:

SELECT
    cid,
    (ts_rank(tsv, q) + ts_rank_cd(tsv, q)) AS rank
FROM
    search,
    plainto_tsquery(%(query)s) AS q
WHERE
    (tsv @@ q);

其中 cid 是提交哈希,tsv 是每个提交的相关信息的文本搜索向量。

我的目标是允许用户在查询中仅提供提交哈希的一部分,并提供基本上来自其输入的所有提交。

我研究了三元组,它看起来最有前途,但我不完全确定如何将它们集成到此查询中。

最佳答案

1:创建 tsvector 的列/ View /物化 View 。

CREATE MATERIALIZED VIEW unique_lexeme AS
SELECT word FROM ts_stat(
'SELECT to_tsvector('simple', post.title) || 
    to_tsvector('simple', post.content) ||
    to_tsvector('simple', author.name) ||
    to_tsvector('simple', coalesce(string_agg(tag.name, ' ')))
FROM post
JOIN author ON author.id = post.author_id
JOIN posts_tags ON posts_tags.post_id = posts_tags.tag_id
JOIN tag ON tag.id = posts_tags.tag_id
GROUP BY post.id, author.id');

2:使用三元组从此列中选择

SELECT word
FROM unique_lexeme
WHERE similarity(word, 'samething') > 0.5 
ORDER BY word <-> 'samething';

(在此站点中搜索:拼写错误 http://rachbelaid.com/postgres-full-text-search-is-good-enough/ )

3:找到单词后,使用它们对结果进行排名。 使用子查询:

选择单词 WHERE 相似度(单词,'相同')> 0.5 按单词排序 <-> '相同';

或者,您可以创建一个子查询来检查相似性。

补充:

为 tsvector 列建立索引。

同时刷新物化 View ( http://www.postgresqltutorial.com/postgresql-materialized-views/ )。

使用触发器更新列 ( https://www.postgresql.org/docs/9.0/textsearch-features.html )

关于postgresql - 如何在 postgres 中结合全文搜索和 trigrams,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44574188/

相关文章:

postgresql - postgres 函数丢失列名

PHP 和 MySQL 搜索大量列

Python Pandas NLTK 从 Dataframe 'join() argument' 错误的文本字段中提取常用短语 (ngrams)

postgresql : read GIN index content

PostgreSQL:设置时区格式

sql - 使用 PostgreSQL 选择层次结构的某些级别

hibernate - 如何在 Eclipse 中连接 Hibernate 和 PostgreSQL?

hibernate - 如何使用JPA + MySQL在Spring Boot中实现全文搜索

postgresql - Postgres 全文搜索忽略 url

sql - PostgreSQL 从 FUNCTION args 设置配置