Lucene原理

8.Lucene:


为什么使用索引?普通的方式一个个去匹配,如果文本的数量少建立索引所用的时间可能比不建立索


引使用的时间更长,但是对于大文本的数据,并且反复使用的,建立索引的优点就显示出来了。
如何建立索引?
1)将原文档传递给分词器(分词器分文中文和英文的),英文的分词器尝试去做的工作a.将


文档分为一个个单独的单词b.去掉标点符号c.去掉停词;经过分词(Tokenizer) 后得到的结果称为词元(Token)
2)将得到的词元(Token)传给语言处理组件
。语言处理组件的几个工作:
a)将字母变为小写 b)将单词格式成为根的形式如cars变成car;语言处理组件处理完成后的组件称之为词。
3)将得到的词传递给索引组件,索引组件主要的工作有以下几点:
a)利用得到的词创建一个字典.b)对字典按照字母顺序进行排序。c)合并相同的词
4)索引建立完毕后直接跟在索引后面的是对应的文档,其中包含当前的索引在几个文档中出


现过,每个文档中该索引又出现了多少次等信息

如何进行查询呢?
1)输入查询语句
2)对输入的语句进行词法,语法以及语言的处理
a)词法分析主要用来进行识别单词和关键字(介词),如果关键词写错会按照普通的单词进行参与查询
b)语法分析主要是根据查询语句形成一颗语法树,如果不满足语法规则则会报错
c)语言处理和处理索引的时候类似,将单词变成最原始的形态


3)搜索索引,得到符合语法树的文档          。将得到的相同文档合并
4)根据文档和语法树的相关性对结果进行排序(排序就是根据文档之间的匹配度进行打分)
怎么计算得分?
a)找出词对文档的重要性,也就是计算词权重的过程,词的权重表示词在文档中的重要程度,越重要的词权重
越大。
计算权重的方法:
首先影响一个词在一篇文章中的重要性有两个因素:Term Frequency(当前文档中关键词出现


的此数tf)和有多少文档出现了该Term(Document Frequency)称为df(越大越不重要)
然后权重值就可以计算出来了:Wt,d = TFt,d*log(n/DFt)   
[
Wt,d表示词t在文档d中的权重
TFt,d表示词t在文档d中的频率
DFt 表示词t多少文档包含次Term(该词)
其中n是所有文档中所有的单词或者汉字的个数

]


b)判断词之间的关系从而得到文档相关性的过程应用了一种叫做“向量空间模型的算法”


解释:
我们把文档看作一系列词(Term),每一个词(Term)都有一个权重(Term weight),不同的词(Term)根据


自己在文档中的权重来影响文档相关性的打分计算。
于是我们把所有此文档中词(term)的权重(term weight) 看作一个向量。
Document = {term1, term2, …… ,term N}
Document Vector = {weight1, weight2, …… ,weight N}
同样我们把查询语句看作一个简单的文档,也用向量来表示。
Query = {term1, term 2, …… , term N}
Query Vector = {weight1, weight2, …… , weight N}


如果这两个向量空间夹角越小,代表他们之间的相关性就越高(也就是得出的值很大,那么就是计算两个向量余弦)


问题:

有人可能会问,查询语句一般是很短的,包含的词(Term)是很少的,因而查询向量的维数很小,而文

档很长,包含词(Term)很多,文档向量维数很大。你的图中两者维数怎么都是N呢?

在这里,既然要放到相同的向量空间,自然维数是相同的,不同时,取二者的并集,如果不含某个词(Term)时,则权重(Term Weight)为0。

你可能感兴趣的:(Lucene&solr)