我在我的Web应用程序中有一个文本字段,我想要自动完成(例如,用户键入“St”,我可以建议“Steve”)。我匹配的名称位于用户的SQL数据库表中。我的问题是,我怎样才能以一种可以扩展到大量用户的方式来实现这一目标?针对SQL数据库的名称自动完成
有DB全文搜索或类似Lucene的东西。这甚至适用于像这样的“开始”查询吗?
有没有办法为“开始”类型搜索设置正常的数据库索引?
任何其他的想法,我完全失踪?
任何帮助,将不胜感激。谢谢。
我在我的Web应用程序中有一个文本字段,我想要自动完成(例如,用户键入“St”,我可以建议“Steve”)。我匹配的名称位于用户的SQL数据库表中。我的问题是,我怎样才能以一种可以扩展到大量用户的方式来实现这一目标?针对SQL数据库的名称自动完成
有DB全文搜索或类似Lucene的东西。这甚至适用于像这样的“开始”查询吗?
有没有办法为“开始”类型搜索设置正常的数据库索引?
任何其他的想法,我完全失踪?
任何帮助,将不胜感激。谢谢。
只要您在名称列上有索引,这些应该可以完成这项工作。
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
如果您希望自动填充的字段上有一个有序索引,则可以在“开始于”样式查询中使用它。
大多数升序索引将用于优化与LIKE' xxx%' - 类型的查询。出于性能考虑,我建议您设定上限,以试图从数据库返回的结果数:
SELECT TOP 10 LastName
FROM tbl
WHERE LastName LIKE @start + '%'
ORDER BY LastName
有滚动到你想要做的量的限制。
不要在SQL中做它...?
在浏览器中发送列表和自动完成。这就是我们所做的。
这样,我们避免了像香港客户端 - >瑞士网页服务器 - >瑞士SQL服务器往返每用户按键。我们只做一次加载页面,然后它就是客户端。
我们有类似的东西在我们的驱动自动提示控制大数据集的9000项(大部分是远不)
编辑,注释后:
就像我说的,我们大部分的名单是远不如。但是,即使加载额外的200k也是更好的,然后每按一下键即可跳至数据库。
事实上,你可以往返意味着“内联网”,所以页面加载时间也是无关紧要的。与往返延迟相比,200k无所谓...
这是一个很好的方式来导致长时间的页面加载。 9000个项目是每个页面加载额外的70K-200K,这只是一个领域。 – tster 2009-09-30 19:19:04
@tster:那么你宁愿每次按键都要去数据库? – gbn 2009-10-01 04:09:54
为什么这是低调?这并不是一个坏主意。 +1。当然,这些列表应该位于外部可缓存的js文件中,并且最好是异步加载的。 – erikkallen 2009-11-04 21:23:12
感谢您的答复。我没有意识到它可以像这样的查询使用索引,但解释计划证实它是正确的。 – Sean 2009-09-30 18:37:46
erikkallen - 抱歉挑剔,但我真的认为TOP是一个“关键字”。 Atleast for Mysql,我想你的意思是 - “SELECT name FROM names where name like'St%'LIMIT 10” – 2009-11-03 17:56:47
@Bart:Fixed ... – erikkallen 2009-11-04 21:27:33