概念
倒排索引是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射,常被应用于搜索引擎和关键字查询的问题中。
以英文为例,下面是要被索引的文本:
1 | T0 = "it is what it is" |
有两种不同的反向索引形式:
- 一条记录的水平反向索引(或者反向档案索引)包含每个引用单词的文档的列表。
- 一个单词的水平反向索引(或者完全反向索引)又包含每个单词在一个文档中的位置
我们就能得到下面的反向文件索引:1
2
3
4
5"a": {2}
"banana": {2}
"is": {0, 1, 2}
"it": {0, 1, 2}
"what": {0, 1}
检索的条件”what”,”is”和”it”将对应集合的交集。检索的条件”what”, “is” 和 “it” 将对应这个集合: ${\displaystyle {0,1}\cap {0,1,2}\cap {0,1,2}={0,1}}$。
下面得到的是第二种倒排索引,包含有文档数量和单词结果在文档中的位置
组成的的成对数据。
1 | "a": {(2, 2)} |
实现第一种倒排索引
在Map端,把单词和文件名作为key值,把单词词频作为value值。在Combine阶段,需要把单词设成key,文件名和词频作为value值,将相同单词的所有记录发送给同一个Reducer处理
在Reduce端,生成文档列表。
Mapper
1 | public static class InvertedIndexMapper extends Mapper<Object, Text, Text, Text>{ |
Combiner
1 | // Combiner merge word frequency |
Reducer
1 | // 生成单词的文档列表 |
实现第二种倒排索引
使用自定义的数据类型