步骤:
第一步:一些要索引的原文档(Document)。
为了方便说明索引创建过程,这里特意用两个文件为例:
文件一:Students should be allowed to go out with their friends, but not allowed to drink beer.
文件二:My friend Jerry went to school to see his students but found them drunk which is not
allowed
第二步:将原文档传给分次组件(Tokenizer)。
分词组件(Tokenizer)会做以下几件事情(此过程称为Tokenize):
1. 将文档分成一个一个单独的单词。
2. 去除标点符号。
3. 去除停词(Stop word)。
所谓停词(Stop word)就是一种语言中最普通的一些单词,由于没有特别的意义,因而大多数
情况下不能成为搜索的关键词,因而创建索引时,这种词会被去掉而减少索引的大小。
英语中挺词(Stop word)如:“the”,“a”,“this”等。
对于每一种语言的分词组件(Tokenizer),都有一个停词(stop word)集合。
第三步:将得到的词元(Token)传给语言处理组件
(Linguistic Processor)
语言处理组件(linguistic processor)主要是对得到的词元(Token)做一些同语言相关的处理。
对于英语,语言处理组件(Linguistic Processor)一般做以下几点:
1. 变为小写(Lowercase)。
2. 将单词缩减为词根形式,如“cars”到“car”等。这种操作称为:stemming。
3. 将单词转变为词根形式,如“drove”到“drive”等。这种操作称为:lemmatization。
第四步:将得到的词(Term)传给索引组件(Indexer)。
索引组件(Indexer)主要做以下几件事情:
1. 利用得到的词(Term)创建一个字典。
2. 对字典按字母顺序进行排序。
3. 合并相同的词(Term)成为文档倒排(Posting List)链表。
在此表中,有几个定义:
Document Frequency 即文档频次,表示总共有多少文件包含此词(Term)。
Frequency 即词频率,表示此文件中包含了几个此词(Term)
1. 计算权重(Term weight)的过程。
影响一个词(Term)在一篇文档中的重要性主要有两个因素:
Term Frequency (tf):即此Term 在此文档中出现了多少次。tf 越大说明越重要Document Frequency (df):即有多少文档包含次Term。df 越大说明越不重要
容易理解吗?词(Term)在文档中出现的次数越多,说明此词(Term)对该文档越重要,如“搜索”
这个词,在本文档中出现的次数很多,说明本文档主要就是讲这方面的事的。然而在一篇英
语文档中,this 出现的次数更多,就说明越重要吗?不是的,这是由第二个因素进行调整,
第二个因素说明,有越多的文档包含此词(Term), 说明此词(Term)太普通,不足以区分这些文
档,因而重要性越低。
的全文检索的流程对应的Lucene 实现的包结构
上图示为Lucene 索引文件的整体结构:
属于整个索引(Index)的segment.gen,segment_N,其保存的是段(segment)的元数
据信息,然后分多个segment 保存数据信息,同一个segment 有相同的前缀文件名。
对于每一个段,包含域信息,词信息,以及其他信息(标准化因子,删除文档)
域信息也包括域的元数据信息,在fnm 中,域的数据信息,在fdx,fdt 中。
词信息是反向信息,包括词典(tis, tii),文档号及词频倒排表(frq),词位置倒排表(prx)。
此外,可以通过看源代码,相应的Reader 和Writer 来了解文件结构,将更为透彻。