yangyang12138

导航

lucene

1.索引建立过程

生成write.lock文件,

然后生成fdt,fdx文件

在lucene中,fdt与fdx文件都是在FieldsWriter中生成的。对于每个Document,解析其Fields中的内容后(这个解析过程是比较复杂的,包括分词等操作,后面详细讨论),把Document中的Field作为正向信息原封不动地存储到文件中(一般用于内容的展示,不参与打分排序)。

fdt(FieldData)文件存储Field数据,fdx(FieldIndex)文件存储Field索引。如果把一本书拆成目录和正文两部分,那么fdt文件就是正文,fdx文件就是目录。这样就使得我们能够快捷地读取Document中的内容。从这里也可以猜测,对fdt文件的读取一定是随机的,可以定位的,用到了RandomAccessFile类(顺便说一下RandomAccess类还可以实现文件下载的断点续传功能)。

tis和tii文件的生成

tis和tii两个文件存储Term,即词信息。与fdt文件和fdx文件类似,tis文件存储term内容,tii文件是tis文件的索引。

frq文件的生成

frq文件存储倒排表信息,即每个term在哪些文档中出现,并且存term在每个文档出现的次数。此文件在FormatPostingsDocsWriter的构造函数中生成。

prx文件的生成

 prx文件存储的是每个term在出现文档中的位置信息。

由FormatPostingsPositionsWriter的构造函数生成。需要注意的是,如果所有的Field都需要不保存词的位置信息,则此文件将不存在。

 norm文件的生成

 norm文件保存所有的标准化因子。该文件在NormsWriter的flush函数中生成。对于标准化因子,乍一看不好理解,通俗而不全面的理解就是“文档加权”(也包含长文档的降权)。标准化因子由三部分组成:document boost、field boost、lengthNorm(field)。

 fnm文件的生成

fnm文件存储的信息非常简单明了,就是Field的名字及field的结构信息。该文件在DocFieldProcessor的flush方法中生成。 

segments_N文件的生成

segments_N文件是索引目录中segments_*文件的总称。此文件存储了索引的段信息,即索引包含了多少段,每个段的段名、段的大小、段包含Document数目等信息。该文件在SegmentInfos类的write方法中生成。

2.lucene打分算法

底层基于lucene,lucene用于建立索引,对搜索的结果打分,默认打分算法

 

 其中queryNorm(t,d)是查询归一化因子,其值为查询语句中每一个查询词权重的平方和。查询归一化因子使得比较不同查询语句的得分变得可行,当然比较不同查询语句得分并不总是那么易于实现和可行的,

 这个因素对所有文档都是一样的值,所以它不影响排序结果。比如如果我们希望所有文档的评分大一点,那么我们就需要设置这个值。

 coord为调整因子,文档中命中检索的个数/检索条件的个数

 boost为域权重,在查询的时候给某个域设置的权重值

 norm(t,d)这个项是长度的加权因子,目的是为了将同样匹配的文档,比较短的放比较前面。

 tf 一个词在一个文档中出现的频率,idf(t)是逆文本频率指数,idf计算公式为

 

 j是出现该词的文本数量,D是文档总数量,tf*idf即为一个词在所有文档的重要程度,tf*(idf*idf)即加大了idf对重要性的影响。

 

posted on 2019-12-18 00:58  杨杨09265  阅读(235)  评论(0编辑  收藏  举报