【问题标题】:Sphinx and GUIDs狮身人面像和 GUID
【发布时间】:2011-02-09 00:54:22
【问题描述】:

我们有一个想要使用 Sphinx 搜索引擎索引的数据库。问题是 Sphinx 需要每个文档的整数 ID,但我们的数据库有 GUID(实际上是随机的类似 GUID 的字符串)作为主键。我可以即时生成合成 ID as described in this recipe,但它仅适用于完整索引。如果我想拥有增量索引或运行时索引怎么办?是否有使用 Sphinx 处理 GUID 的最佳实践,可以使用增量索引和运行时索引?有问题的数据库会很大,所以我不想经常重新索引它们。

【问题讨论】:

    标签: mysql full-text-search sphinx


    【解决方案1】:

    实时索引:您可以将非数字 GUID 转换为数值(您可以使用转换为数字的 crc32 或 md5),如下所示:

    mysql> select conv(mid(md5('abc'), 1, 16), 16, 10);
    +--------------------------------------+
    | conv(mid(md5('abc'), 1, 16), 16, 10) |
    +--------------------------------------+
    | 10376663631224000432                 | 
    +--------------------------------------+
    1 row in set (0.00 sec)
    

    测试或谷歌找出哪种算法会减少冲突。

    一旦您有了数字 ID,您就可以将您的文档插入到 Sphinx RT 索引中。

    增量索引:您可以使用上述相同的方法将 GUID 转换为数字,但您必须记住索引的主要部分在哪里完成以构建增量。如果您的表中有一些“更新”或“插入”字段,则可以轻松完成。 sql_query_range 将类似于“select ... where updated > (select last_updated from sphinx_helper)”。在这种情况下,您不能基于 id,因为它们不是连续的。

    我已经在 1180 万个不同的域上测试了一半的 md5 算法:

    mysql> update domain_tmp set hash = conv(mid(md5(domain), 1, 16), 16, 10);
    Query OK, 5901483 rows affected (1 min 59.03 sec)
    Rows matched: 11800403  Changed: 5901483  Warnings: 0
    
    mysql> select count(*) from domain_tmp;
    +----------+
    | count(*) |
    +----------+
    | 11800403 | 
    +----------+
    1 row in set (16.30 sec)
    
    mysql> select count(distinct hash) from domain_tmp;
    +----------------------+
    | count(distinct hash) |
    +----------------------+
    |             11800403 | 
    +----------------------+
    1 row in set (1 min 5.51 sec)
    

    即没有发生碰撞。因此,如果您的数据集中没有更多文档,则使用 md5 的一半应该没问题。

    【讨论】:

    • 我不能真正改变所有的表结构(数据库有 50 多个表,表结构由类似 ORM 的系统生成)来生成新的 ID。我可能可以使用 md5 方法......但我担心碰撞。
    • 您不需要更改表结构,您可以在使用 Sphinx 索引器进行 SELECT 时即时生成新的 ID。至于冲突——一半的 md5 看起来还不错,我已经在 1180 万个不同的域上对其进行了测试——没有一个冲突。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    相关资源
    最近更新 更多