支持通配符查询的k-gram索引

k-gram索引的通配符查询处理技术称为k-gram索引。
一个k-gram代表由k个字符组成的序列。对于词项castle来说,casaststl都是3-gram。我们用特殊的字符$来标识词项的开始或者结束,因此对于castle来说,所有的3-gram包括$cacasaststltle及le $ .
在k-gram索引结构中,其词典由词汇表中所有词项的所有k-gram形式构成,而每个倒排记录表则由包含该k-gram的词项组成。
然而使用k-gram索引往往还需要进行一步处理。考虑3-gram索引结构的情况,对于查询red*,按照上面的处理步骤我们就会将原始查询转换为布尔查询$re AND red,这时可能会返回诸如retired的词项,因为他同时包含$rered,但是这个结果显然并不满足原始的查询red,也就是说采用k-gram索引会导致非预期的结果。
为了解决这个问题,我们引入一个称为后过滤(postfiltering)的步骤,即利用原始的查询red
对上述布尔查询产生的结果进行逐一过滤。过滤时只需要做简单的字符串匹配。和前面一样,我们最后在普通倒排索引中查找上述过滤得到的结果词项,从而得到最终的文档集合。
一个通配符查询往往会返回多个词项,而每个词项再根据普通倒排索引返回其所在的文档。索引引擎还可以通过布尔操作符支持多个通配符查询的集合,比如 re*d AND fe*ri。那么该查询的语义是什么?由于每个通配符查询都会变成多个词项的或查询,所以上述查询最后变成多个查询的与,即寻找包含同时匹配上red和feri的词项文档。
即使没有通配符查询的布尔组合,单个通配符查询处理也是非常耗时的,除了最后要在普通倒排索引中查找之外,还要在特定索引(如轮排索引或k-gram索引)中进行查找、在结果中进行过滤等操作。搜索引擎可以支持这些丰富的功能,但是搜索引擎通常将这些功能隐藏在一个大部分用户不访问的界面(如“高级索引”界面)下。如果把这些功能暴露在一般搜索界面上,用户常常会受到鼓励而使用这些功能,即便他们不是特别需要的时候(比如以a*开始的查询的索引),这样就会大大增加搜索引擎的负担。

原文地址:https://www.cnblogs.com/mr-cc/p/6215415.html