【发布时间】:2010-10-15 07:20:42
【问题描述】:
我正在尝试在我正在构建的网站上实现类似 Google 建议的功能,并且很好奇如何处理非常大的数据集。当然,如果您有 1000 个项目,您可以缓存这些项目并循环它们。但是,当您拥有一百万件物品时,您将如何处理呢?此外,假设这些项目不是一个词。具体来说,我对 Pandora.com 印象深刻。例如,如果您搜索“wet”,它会返回“Wet Sand”,但也会返回 Toad The Wet Sprocket。他们的自动完成功能很快。我的第一个想法是按前两个字母对项目进行分组,所以你会有类似的东西:
Dictionary<string,List<string>>
其中的关键是前两个字母。没关系,但是如果我想做类似于 Pandora 的事情并允许用户看到匹配字符串中间的结果怎么办?根据我的想法:Wet 永远不会与 Toad the Wet Sprocket 匹配,因为它将位于“TO”存储桶而不是“WE”存储桶中。那么也许您可以将字符串拆分,并将“Toad the Wet Sprocket”放入“TO”、“WE”和“SP”存储桶(去掉“THE”这个词),但是当您正在谈论一百万个条目,每个条目可能不得不说几句话,这似乎您很快就会开始消耗大量内存。好的,这是一个很长的问题。想法?
【问题讨论】:
-
你能提供一些关于你的数据的数字吗?几串?平均长度和平均字数?哪种语言?
-
目前有 496,000 个字符串。平均长度 14 个字符。平均字数 2.3。 C#。哦,还有像Л和И这样的非ASCII字符
-
我已经实现了一个自动完成解决方案,使用 docker compose(以便更容易理解),源代码公开可用:lopespm.github.io/2020/08/03/…。希望有帮助