我在postgresql数据库上使用大表(数百万行),每行都有name
列,我想对该列执行搜索。
例如,如果我正在搜索电影Django Unchained,我希望查询返回电影,无论我是搜索Django还是Unchained(或Dj或Uncha),就像IMDB搜索引擎一样。
我查找了全文搜索,但我相信它更适用于长文本,我的name
列永远不会超过4-5个字。
我已经考虑过拥有多对多关系的表格关键字,但我不确定这是最好的方式。
查询数据库的最有效方法是什么?
答案 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的扩展,支持这种索引结构。如果你谷歌那么你会找到一堆有用的东西。