字典类型:CRC与关键词

在本文中,我们将讨论Manticore Search中可用的两种字典类型之间的差异。

字典 是存储索引词的索引组件。最初的索引使用了"crc“字典类型,其中单词被替换为其控制和校验值,使用CRC32或FVN64,取决于Sphinx是否使用enable-id64编译。在Manticore中,仅使用FVN64,因为32位ID已被移除。

随着实时索引的引入,以及由于一些潜在的缺陷,对另一种字典类型的需求应运而生。在Sphinx 2中,添加了”关键词“字典,它存储实际的单词并修复了”crc“的一些缺陷,但也带来了一些小问题。

实时索引(以及新的 percolate索引 )只能使用”关键词“类型,而”crc“类型仅适用于普通索引。普通索引需要”关键词“字典以允许转换为实时索引。一些较新的功能,如 CALL QSUGGEST ,需要存储实际的单词,而这在”crc“字典中是无法实现的。

在未启用前缀/中缀的情况下:使用”关键词“字典的索引索引速度较慢。第一个原因是”关键词“将整个单词存储在字典中(最多127个字符),而”crc“将任何单词折叠为4字节哈希。在索引的最后阶段,”关键词“类型必须执行单词排序,这可能需要一些时间。简而言之,”关键词“的索引速度可能比”crc“慢10%-40%。当禁用前缀/中缀时,索引大小和搜索时间是相似的。

在启用前缀/中缀的情况下:”crc“需要为子字符串构建额外的单词排列,因此在这种情况下可能比”关键词“慢。当仅启用前缀时,”关键词“字典没有额外的索引步骤。仅对于中缀,它会从单词中提取和收集三元组(用于QSUGGEST)。由于额外的单词排列,”crc“的索引大小可能会比禁用前缀/中缀的版本大10倍。由于不需要存储额外的子字符串,”关键词“字典的索引大小与禁用前缀/中缀的版本相比不会增长。

对于通配符搜索,在”关键词“模式下,关键词会扩展为索引中与通配符搜索匹配的所有可能存储的单词。在某些极端情况下,扩展可能会达到数千个单词,这种操作可能会减慢查询速度。可以通过” expansion_limit “限制这种效果,或者避免有问题的扩展。”CRC“没有这个问题,因为扩展是在索引时计算的,而不是在查询时。虽然它在速度上有优势,但索引大小仍然是”crc“类型的主要问题。也不可能使用特殊符号'?''%'进行通配符搜索,如't?st*''run%'

总的来说,”关键词“类型是更好的选择,因为它提供了更多功能,并且如果需要使用通配符搜索,索引大小可以得到控制。然而,通配符搜索在某些情况下可能需要注意。
虽然”crc“在Sphinx中被标记为已弃用,但我们决定取消此标记,因为”crc“在某些情况下仍然有用。

crc“的优势在于索引速度,这在使用增量索引并需要在特定时间窗口内完成时可能很重要。对于通配符搜索,”crc“是一把双刃剑:虽然它没有像”关键词“那样的潜在性能问题,但使用时必须考虑其空间需求。

安装Manticore Search

安装Manticore Search