我们有一个数据库,我们想用Sphinx搜索引擎索引。问题是Sphinx需要每个文档的整数ID,但我们的数据库有GUID(实际上是类似随机GUID的字符串)作为主键。我可以动态生成合成ID as described in this recipe,但它仅适用于完整索引。如果我想要增量索引或运行时索引怎么办?是否有任何最佳实践来处理使用Sphinx的GUID,它们可以用于增量索引和运行时索引?有问题的数据库会非常大,所以我不想经常重新索引它们。
答案 0 :(得分:9)
实时索引:您可以将非数字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>(从sphinx_helper中选择last_updated)”。在这种情况下,你不能以ids为基础,因为它们不是连续的。
我在11.8M不同的域上测试了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的一半。