【问题标题】:How to combine full text search and trigrams in postgres如何在 postgres 中结合全文搜索和三元组
【发布时间】:2017-06-15 18:09:26
【问题描述】:

我正在开发一个 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 是每个提交的相关信息的文本搜索向量。

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

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

【问题讨论】:

  • 而不仅仅是cid LIKE '1234...%'? commit-id 的缩写形式总是左锚定的,不是吗?
  • 我只有一个搜索栏可以搜索所有类型的文本,所以我什至无法确定他们是否输入了 cid。虽然这似乎是一个合理的假设,但我尚未正式验证。
  • 不是真正的答案,而是 FWIW 我不知道如何实现此搜索,包括使用三元组,而不首先尝试从用户输入中识别潜在的短提交 ID。
  • 我当时的想法是简单地计算每个提交哈希的三元组,并将该列表添加到搜索向量中,但我不知道如何获得结果的 show_trgm 进入搜索向量。另一种方法是查看查询并找到“看起来”像哈希的任何内容,然后针对所有哈希进行尝试。
  • 看起来我可以使用 array_to_tsvector(show_trgm(commit_hash)) 以及其他所有内容。我试试看。

标签: postgresql full-text-search trigram


【解决方案1】:

1:创建 tsvector 的列/视图/物化视图。

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 相似度(单词,'samething')> 0.5 ORDER BY word 'samething';

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

补充:

索引 tsvector 列。

同时刷新实体化视图 (http://www.postgresqltutorial.com/postgresql-materialized-views/)。

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

【讨论】:

    猜你喜欢
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 2020-05-07
    • 1970-01-01
    相关资源
    最近更新 更多