使用关键字有效搜索

时间:2014-06-01 12:18:40

标签: sql postgresql search

我在postgresql数据库上使用大表(数百万行),每行都有name列,我想对该列执行搜索。

例如,如果我正在搜索电影Django Unchained,我希望查询返回电影,无论我是搜索Django还是Unchained(或Dj或Uncha),就像IMDB搜索引擎一样。

我查找了全文搜索,但我相信它更适用于长文本,我的name列永远不会超过4-5个字。

我已经考虑过拥有多对多关系的表格关键字,但我不确定这是最好的方式。

查询数据库的最有效方法是什么?

3 个答案:

答案 0 :(得分:3)

我的猜测是,对于您想要做的事情,全文搜索是最佳解决方案。 (记录here。)

它允许您搜索任何完整的单词。它允许您搜索单词的前缀(例如" Dja")。另外,您可以根据需要添加同义词。它不允许在单词的开头使用通配符,因此" Jango"需要用同义词来处理。

如果这不符合您的需求并且您需要like的功能,我建议如下。将标题放入一个单独的表中,该表基本上有两列:id和标题。目标是尽可能快地扫描桌面,这反过来意味着让标题适合尽可能小的空间。

还有另一种解决方案,即n-gram搜索。我不确定Postgres是否原生支持它,但here是一篇关于该主题的有趣文章,其中包含用于实现它的Postgres代码。

答案 1 :(得分:0)

在较大字符串中的任意位置搜索子字符串的标准方法是使用LIKE运算符:

SELECT *
FROM mytable
WHERE name LIKE '%Unchai%';

但是,如果您有数百万行,它将会很慢,因为索引没有明显的效率。

您可能希望涉及多种策略,例如首先检索name的值以搜索字符串开头的记录(可以从name列上的索引中受益 - {{1然后在第二次非索引传递之后添加字符串中间命中。在解释字符串时,人类往往比计算机慢得多,因此用户可能不会受苦。

答案 2 :(得分:0)

此问题与表单中的自动填充非常相关。你会找到几个线程。

基本上,您需要一种特殊的索引,即空间分区树。 Postgres有一个名为SP-GiST的扩展,支持这种索引结构。如果你谷歌那么你会找到一堆有用的东西。