Mysql 斯芬克斯与吉德
我们有一个数据库,我们想索引与斯芬克斯搜索引擎。问题是Sphinx要求每个文档都有整数ID,但我们的数据库实际上有GUID,即类似GUID的随机字符串作为主键。我可以动态生成合成ID,但它只适用于完整索引。如果我想要增量索引或运行时索引呢?使用Sphinx处理guid时,有哪些最佳实践可以处理增量索引和运行时索引?所涉及的数据库将相当大,因此我不想频繁地对它们重新编制索引 实时索引:您可以将非数字GUID转换为数字值。您可以使用crc32或md5转换为如下数字:Mysql 斯芬克斯与吉德,mysql,full-text-search,sphinx,Mysql,Full Text Search,Sphinx,我们有一个数据库,我们想索引与斯芬克斯搜索引擎。问题是Sphinx要求每个文档都有整数ID,但我们的数据库实际上有GUID,即类似GUID的随机字符串作为主键。我可以动态生成合成ID,但它只适用于完整索引。如果我想要增量索引或运行时索引呢?使用Sphinx处理guid时,有哪些最佳实践可以处理增量索引和运行时索引?所涉及的数据库将相当大,因此我不想频繁地对它们重新编制索引 实时索引:您可以将非数字GUID转换为数字值。您可以使用crc32或md5转换为如下数字: mysql> select
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\u查询\u范围将是smth,如select。。。在更新的位置>选择从sphinx\u助手更新的最后一个\u。在这种情况下,您不能基于ID,因为它们不是顺序的
我已经在1180万个不同的域上测试了md5 algo的一半:
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)
i、 e.没有发生碰撞。因此,如果您的数据集中没有太多文档,那么可以使用md5的一半。我无法真正更改所有的表结构DB有50多个表,这些表结构由类似ORM的系统生成,以生成新ID。我可能会使用md5方法。。。但我担心冲突。您不需要更改表结构,您可以在通过Sphinx indexer进行选择时动态生成新ID。至于碰撞-md5的一半看起来很好,我已经在1180万个不同的域上进行了测试-没有任何碰撞。