在大型列表中查找字母位置

时间:2009-03-07 15:57:54

标签: database search alphabetized

我有一个as400表,其中包含大约100万行全名/公司名称,我想将其转换为使用另一个数据存储区,同时仍然匹配原始速度。

目前,用户输入搜索并几乎立即获得表格和匹配页面中搜索词的字母位置。然后,用户可以非常快速地在记录中向上或向下分页。

几乎没有数据更新,每周约50次插入。我认为任何数据库都可以维护名称的字母索引,但我不确定如何在数据集中快速找到搜索的位置。任何建议都非常感谢。

3 个答案:

答案 0 :(得分:2)

这听起来就像是对结果进行定期分页,除了根据请求的页码或偏移量转到特定页面,它会根据用户搜索按字母顺序排列的结果进入特定页面。

假设您要在此位置后获取10行,之前需要10行。

如果用户搜索“Smith”,您可以执行以下两项选择:

SELECT
  name
FROM
  companies
WHERE
  name < 'Smith'
ORDER BY
  name DESC
LIMIT 10

然后

SELECT
  name
FROM
  companies
WHERE
  name >= 'Smith'
ORDER BY
  name
LIMIT 10

你可以在一个查询中做一个UNION来获取它,上面只是简化了。

用户搜索的术语将适合这些结果的一半。如果存在任何完全匹配,则第一个完全匹配将被定位为第十一个。

请注意,如果用户搜索“aaaaaaaa”,那么他们可能只会获得前面没有任何内容的10个结果,而对于“zzzzzzzz”,他们可能只获得最后10个结果。

我假设有问题的SQL引擎允许&gt; =和&lt;字符串之间的比较(并且可以在索引中进行优化),但我没有对此进行测试,也许你不能这样做。如果像MySQL一样,它支持国际化的排序规则,那么你甚至可以为非ascii字符正确地完成排序。

答案 1 :(得分:1)

如果“搜索的位置”是指按字母顺序枚举的记录编号,您可能需要尝试以下操作:

select count(*) from companies where name < 'Smith'

大多数数据库应该合理地优化(但尝试一下 - 你在网上阅读的理论并不能胜过经验数据)。

答案 2 :(得分:1)

只是添加订购建议:

  • 如果这是您的标准数据检索方法,请为名称添加索引。
  • 您可以通过合并LIMIT and OFFSET
  • 来有效地进行分页