2009-09-30 42 views
4

我在我的Web应用程序中有一个文本字段,我想要自动完成(例如,用户键入“St”,我可以建议“Steve”)。我匹配的名称位于用户的SQL数据库表中。我的问题是,我怎样才能以一种可以扩展到大量用户的方式来实现这一目标?针对SQL数据库的名称自动完成

  1. 有DB全文搜索或类似Lucene的东西。这甚至适用于像这样的“开始”查询吗?

  2. 有没有办法为“开始”类型搜索设置正常的数据库索引?

  3. 任何其他的想法,我完全失踪?

任何帮助,将不胜感激。谢谢。

回答

4

只要您在名称列上有索引,这些应该可以完成这项工作。

SQL服务器:

SELECT TOP 10 name FROM names WHERE name LIKE 'St%' 

的MySQL(根据巴特十):

SELECT name FROM names WHERE name LIKE 'St%' LIMIT 10 

甲骨文:

SELECT name FROM names WHERE name LIKE 'St%' AND rownum < 10 
+0

感谢您的答复。我没有意识到它可以像这样的查询使用索引,但解释计划证实它是正确的。 – Sean 2009-09-30 18:37:46

+0

erikkallen - 抱歉挑剔,但我真的认为TOP是一个“关键字”。 Atleast for Mysql,我想你的意思是 - “SELECT name FROM names where name like'St%'LIMIT 10” – 2009-11-03 17:56:47

+0

@Bart:Fixed ... – erikkallen 2009-11-04 21:27:33

1

如果您希望自动填充的字段上有一个有序索引,则可以在“开始于”样式查询中使用它。

0

大多数升序索引将用于优化与LIKE' xxx%' - 类型的查询。出于性能考虑,我建议您设定上限,以试图从数据库返回的结果数:

SELECT TOP 10 LastName 
FROM tbl 
WHERE LastName LIKE @start + '%' 
ORDER BY LastName 

有滚动到你想要做的量的限制。

1

检查此article在SQL Server中的全文搜索。

this一个关于索引的类型存在以及何时使用它们。

-1

不要在SQL中做它...?

在浏览器中发送列表和自动完成。这就是我们所做的。

这样,我们避免了像香港客户端 - >瑞士网页服务器 - >瑞士SQL服务器往返每用户按键。我们只做一次加载页面,然后它就是客户端。

我们有类似的东西在我们的驱动自动提示控制大数据集的9000项(大部分是远不)

编辑,注释后:

就像我说的,我们大部分的名单是远不如。但是,即使加载额外的200k也是更好的,然后每按一下键即可跳至数据库

事实上,你可以往返意味着“内联网”,所以页面加载时间也是无关紧要的。与往返延迟相比,200k无所谓...

+0

这是一个很好的方式来导致长时间的页面加载。 9000个项目是每个页面加载额外的70K-200K,这只是一个领域。 – tster 2009-09-30 19:19:04

+0

@tster:那么你宁愿每次按键都要去数据库? – gbn 2009-10-01 04:09:54

+0

为什么这是低调?这并不是一个坏主意。 +1。当然,这些列表应该位于外部可缓存的js文件中,并且最好是异步加载的。 – erikkallen 2009-11-04 21:23:12