在本文中,我们将讨论Manticore Search中可用的两种字典类型之间的差异。
dictionary 是一个索引组件,用于存储索引单词。最初的索引使用了'crc'字典类型,其中单词被替换为其控制和值,使用CRC32或FVN64,具体取决于Sphinx是否以enable-id64编译。在Manticore中仅使用FVN64,因为32位ID已被移除。
随着实时索引的引入以及一些潜在缺陷的出现,出现了对替代字典类型的需求。在Sphinx 2中添加了**'keywords'字典,它存储实际单词并修复了我们将在下面讨论的'crc'**的缺陷,但它也有自己的一些小问题。
实时索引(以及新添加的 percolate index )只能使用**'keywords'类型,而'crc'类型仅适用于普通索引。普通索引需要'keywords'字典以允许转换为实时索引。一些较新的功能,如 CALL QSUGGEST ,需要存储实际单词,而这无法通过'crc'**字典完成。
如果未启用前缀/中缀:使用**'keywords'字典的索引速度较慢。第一个原因是'keywords'在字典中存储整个单词(最多127个字符),而'crc'将任何单词折叠为4字节哈希。在索引的最后阶段,'keywords'类型必须执行单词排序,这可能需要一些时间。简而言之,在'keywords'的情况下,索引速度可能比'crc'慢10%-40%**。当前缀/中缀被禁用时,索引大小和搜索时间相似。
如果启用了前缀/中缀:'crc'需要为子字符串构建额外的单词排列,在这种情况下可能比'keywords'更慢。'keywords'字典在仅启用前缀时没有额外的步骤需要执行。仅在启用中缀时,它会从单词中提取和收集三元组(用于QSUGGEST)。由于额外的单词排列,'crc'的索引大小可能比禁用前缀/中缀的版本膨胀更多,甚至超过10倍**。由于不需要存储额外的子字符串,使用'keywords'字典的索引在大小上不会比禁用前缀/中缀的版本增长。
对于通配符,在**'keywords'模式下,关键字会扩展为索引中与通配符搜索匹配的所有可能存储的单词。在某些边缘情况下,扩展可能达到数千个单词,这一操作可能会减慢查询速度。可以通过' expansion_limit '或避免问题扩展来限制这种影响。'CRC'没有这个问题,因为扩展是在索引时计算的,而不是在查询时。虽然它在速度上有优势,但索引大小仍然是'crc'*类型的主要问题。也无法使用特殊符号'?'和'%'进行通配符搜索,如't?st'或'run%'。
总体而言,'keywords'类型是更好的选择,因为它提供了更多功能,并且如果希望使用通配符搜索,索引大小得以控制。然而,在某些情况下,通配符搜索可能需要注意。
虽然在Sphinx中将'crc'标记为不推荐使用,但我们决定去掉这个标记,因为'crc'在某些情况下仍然可以是有用的。
'crc'的优势在于索引速度,这在使用需要适应特定时间窗口的增量索引时可能很重要。对于通配符搜索,'crc'是双刃剑:虽然它没有像'keywords'那样的潜在性能问题,但在使用时必须考虑其空间要求。