首先,我们可以使用「极客时间」作为一个完整的关键词去倒排索引中查找。如果倒排索引中能查询到这个关键词,并且返回的结果集足够,那这样的检索结果是非常精准的。但是,这依赖于我们在构建索引的时候,必须将「极客时间」作为一个关键词进行处理。
可是在构建倒排索引的时候,我们一般是通过分析搜索日志,将一些常见的热门短语作为关键词加入倒排索引中。由于能被直接作为关键词的短语数量不会太多,因此,如果「极客时间」没有被识别为热门短语进行单独处理的话,那我们拿着「极客时间」这个短语作为关键词,直接查询的结果就是空的。
在这种情况下,我们就会使用更细粒度的分词结果,也就是使用「极客」和「时间」这两个关键词,去做两次检索,然后将得到的结果求交集合并。不过,这样做就会有一个问题:如果只是简单地将这两个关键词检索出来的文档列表求交集合并,那我们最终得到的结果并不一定会包含带有「极客时间」的文档。这又是为什么呢?
你可以考虑一下这种情况:如果有一个网页中有一句话是「一个极客往往没有时间打游戏」。那我们搜索「极客」「时间」这两个关键词的时候,这个网页就会被检索出来。但这是我们期望的检索结果吗?并不是。因为「极客」和「时间」的位置离得太远了。
那如果我们能记录下关键词出现在文档中的位置,并且在合并文档列表的时候,判断两个关键词是否接近,不就可以解决这个问题?没错,这种方法就叫作 位置信息索引法。我们会通过两个关键词的位置关系来判断该文档和检索词的相关性。位置越远,相关性就越小,如果位置直接邻接在一起,相关性就最高。
如果是两个以上的关键词联合查询,那我们会将同时包含所有关键词的最小片段称为最小窗口,然后通过衡量查询结果中最小窗口的长度,来判断多个关键词是否接近。这么说比较抽象,我们来举个例子。当我们分别以「极」「客」「时」「间」这四个字作为关键词查询时,如果一个文档中有这么一句话「极多客人,一时之间」,那字符「极」到字符「间」之间就是 9 个字符。也就是说,在这句话中覆盖「极」「客」「时」「间」这四个关键词的最小窗口长度就是 9。
有了这个方法,我们就可以将搜索结果按照最小窗口长度排序,然后留下相关性最高的一批结果了。这样,我们就完成「极客时间」的短语检索了。