【问题标题】:Creating an Index that is best for wildcard search through 40Million names通过 4000 万个名称创建最适合通配符搜索的索引
【发布时间】:2012-08-27 10:59:27
【问题描述】:

任务:在具有约 4000 万个名称的数据库中使用通配符搜索名称搜索的最佳匹配结果。例如query='John' 结果可能是 'John'、'Johnny'、'Smith John'、'ajohn'
候选人:MySQL 全文、Sphinx 和 Lucene。
观察:我认为它们都使用倒排索引,这对于如此短的“文档”(名称)可能不是最佳解决方案,而 trie 可能更合适。

假设这个观察是正确的,这些工具的配置是否更适合我的情况?还有其他可以轻松集成到 PHP 中的工具吗?

谢谢。

【问题讨论】:

    标签: php search lucene full-text-search sphinx


    【解决方案1】:

    我只能为斯芬克斯说话。它确实有一个专门启用通配符搜索的“min_prefix_len”。

    它有两种模式,

    1) 单词的每个前缀都是单独存储的(例如,Johnny 与 Johnny、Johnn、John、Joh、Jo、J 一起存储)因此每个前缀都会匹配。真正快速的查找,但以索引大小和索引速度为代价。

    2) 原始单词被实际存储,前缀与这些匹配。更紧凑的索引和快速索引。但是搜索速度不是很好(sphinx 还没有实现优化——例如将单词列表存储在 trie 中。所以在这种模式下,一个专用的解决方案可以很好地胜过 sphinx。

    建议在模式 1 中,sphinx 将友好地执行您的任务 - 并且比 mysql 更好。 (但不知道它与 Lucene 相比如何)

    【讨论】:

    • 你说'比mysql好',好多少?我假设建立索引会使 INSERTS 工作更慢,与全文 mysql 索引相比多少? SELECTS 会多 x 倍?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多