Lucene4.3进阶开发之礼敬如来(十三) -Similarity
评分功能,在全文检索中也算是一个非常重要的模块,因为评分的好坏,直接决定着用户搜索匹配的相关性.
lucene默认的评分机制,用的VSM(Vector Space Model)空间向量模型,基于TF-IDF的评选方式,TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与资讯探勘的常用加权技术。用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜索引擎还会使用基于链接分析的评级方法,以确定文件在搜寻结果中出现的顺序。
一般常用的方法加权,在索引时给某个 Field加权
这种方式在lucene4.x之前可以给文档和域分别进行加权,但是在4.x之后,只能给域加权,废弃了文档加权的方式.
对比索引时的加权,我们在检索时也可以设置加权boost.
或者也可以用,queryparse的解析表达式表示:
举个例子现在我索引里面有2条数据:
(1)中国一个多民族国家
(2)中国是世界人口大国
当我们检索“中国”的时候,会发现这两个文档的评分一样,因为他们的长度也相等,
而当我们检索“中国 民族”的时候会发现第一个文档会排在前面而且得分要高,为什么呢?
overlap的个数,代表我们在文档中命中的个数
maxOverlap的个数,代表着检索条件里面的个数==>“中国 民族”2个
由此我们假设其他的条件一样的情况下可以推算出1的得分=2/2=1
而第二个的评分是=1/2=0.5
所以文档1的评分会更好,因为它命中了更多的term。
4,影响评分的第四个因素IDF,这个参数代表的含义是,在所有的文档中,如果某个term频繁出现,那么这个term就被认为是普遍词,所以它的得分就要被减免。
idf的方法如下:
注意加1的二个作用第一个是为了避免除数的为0的情况,第二个是为了这个文档在整个文档中不存在的时候,避免其的评分为0的情况存在。
恰恰是由于lucene在计算评分,会将文档的长度计算在里面,因为根据常识,较短文本里,出现命中的词,说明这个词更加重要。
6,lucene里影响评分的第六个因素,载荷Payload,这个功能是一个高级的功能,可以存储时,存储额外的信息,从而在检索时,达到从某种类型的数据动态加权。
举个例子,我们可能希望某个XML里面被如果含有<keyword></keywrod>标记的词从而拥有更高的加权,这时候我们就可以利用载荷实现了,在索引的时候,我们判断term里的标签标记,如果出现了这个特定标签的标记的term,我们就额外存储它的加权载荷信息,从而再检索时,来达到一个良好的检索结果。这时候使用载荷,是一个再好不过的选择了。
除了散仙,上文介绍的6种因素外,加上散仙在文章开始部位介绍的boost放权,目前已经介绍了7种影响打分的因素,当然到这里,并不意味着,这些就是全部的影响评分的方法了,事实上除了这些,还有一些其他的自定义评分的方式,这个散仙会在后续的文章里介绍,大部分的时候,我们了解,利用这些信息,就能解决狠多业务上的需求了,所以我们可以在我们需要的任何时候,都可以继承DefaultSimilarity类,来重写和我们业务相关的最好的打分策略。
Please read full article from Lucene4.3进阶开发之礼敬如来(十三) -Similarity
评分功能,在全文检索中也算是一个非常重要的模块,因为评分的好坏,直接决定着用户搜索匹配的相关性.
lucene默认的评分机制,用的VSM(Vector Space Model)空间向量模型,基于TF-IDF的评选方式,TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与资讯探勘的常用加权技术。用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜索引擎还会使用基于链接分析的评级方法,以确定文件在搜寻结果中出现的顺序。
一般常用的方法加权,在索引时给某个 Field加权
- Field field= new Field("title", "过程", type);
- field.setBoost(10.0f);
这种方式在lucene4.x之前可以给文档和域分别进行加权,但是在4.x之后,只能给域加权,废弃了文档加权的方式.
对比索引时的加权,我们在检索时也可以设置加权boost.
- Query q=parser.parse(term);
- q.setBoost(8f);//检索时加权
或者也可以用,queryparse的解析表达式表示:
- Query q=parser.parse("lucene^10 solr^5");
举个例子现在我索引里面有2条数据:
(1)中国一个多民族国家
(2)中国是世界人口大国
当我们检索“中国”的时候,会发现这两个文档的评分一样,因为他们的长度也相等,
而当我们检索“中国 民族”的时候会发现第一个文档会排在前面而且得分要高,为什么呢?
overlap的个数,代表我们在文档中命中的个数
maxOverlap的个数,代表着检索条件里面的个数==>“中国 民族”2个
由此我们假设其他的条件一样的情况下可以推算出1的得分=2/2=1
而第二个的评分是=1/2=0.5
所以文档1的评分会更好,因为它命中了更多的term。
- public float coord(int overlap, int maxOverlap) {
- return overlap / (float)maxOverlap;
- }
- public float queryNorm(float sumOfSquaredWeights) {
- return (float)(1.0 / Math.sqrt(sumOfSquaredWeights));
- }
- public float tf(float freq) {
- return (float)Math.sqrt(freq);
- }
4,影响评分的第四个因素IDF,这个参数代表的含义是,在所有的文档中,如果某个term频繁出现,那么这个term就被认为是普遍词,所以它的得分就要被减免。
idf的方法如下:
注意加1的二个作用第一个是为了避免除数的为0的情况,第二个是为了这个文档在整个文档中不存在的时候,避免其的评分为0的情况存在。
- public float idf(long docFreq, long numDocs) {
- return (float)(Math.log(numDocs/(double)(docFreq+1)) + 1.0);
- }
恰恰是由于lucene在计算评分,会将文档的长度计算在里面,因为根据常识,较短文本里,出现命中的词,说明这个词更加重要。
- public float lengthNorm(FieldInvertState state) {
- final int numTerms;
- if (discountOverlaps)//代表对同义词不出理
- numTerms = state.getLength() - state.getNumOverlap();
- else
- numTerms = state.getLength();
- return state.getBoost() * ((float) (1.0 / Math.sqrt(numTerms)));
- }
6,lucene里影响评分的第六个因素,载荷Payload,这个功能是一个高级的功能,可以存储时,存储额外的信息,从而在检索时,达到从某种类型的数据动态加权。
举个例子,我们可能希望某个XML里面被如果含有<keyword></keywrod>标记的词从而拥有更高的加权,这时候我们就可以利用载荷实现了,在索引的时候,我们判断term里的标签标记,如果出现了这个特定标签的标记的term,我们就额外存储它的加权载荷信息,从而再检索时,来达到一个良好的检索结果。这时候使用载荷,是一个再好不过的选择了。
- public float scorePayload(int doc, int start, int end, BytesRef payload) {
- return 1;
- }
除了散仙,上文介绍的6种因素外,加上散仙在文章开始部位介绍的boost放权,目前已经介绍了7种影响打分的因素,当然到这里,并不意味着,这些就是全部的影响评分的方法了,事实上除了这些,还有一些其他的自定义评分的方式,这个散仙会在后续的文章里介绍,大部分的时候,我们了解,利用这些信息,就能解决狠多业务上的需求了,所以我们可以在我们需要的任何时候,都可以继承DefaultSimilarity类,来重写和我们业务相关的最好的打分策略。
Please read full article from Lucene4.3进阶开发之礼敬如来(十三) -Similarity
No comments:
Post a Comment