【发布时间】: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