我正在研究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是每次提交的相关信息的文本搜索向量。
我的目标是允许用户仅在其查询中提供部分提交哈希,并提供基本上来自其输入的所有提交。
我已经研究过看起来最有希望的三卦,但我并不完全确定如何将它们整合到这个查询中。
答案 0 :(得分:0)
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:找到单词后,使用它们对结果进行排名。 使用子查询:
选择单词 相似度(word,'samething')> 0.5 按单词<->'samething';
或者,您可以只创建一个子查询来检查相似性。
添加项:
索引tsvector列。
同时刷新实例化视图(http://www.postgresqltutorial.com/postgresql-materialized-views/)。
使用触发器更新列(https://www.postgresql.org/docs/9.0/textsearch-features.html)