翻译:Lucene Similarity (Lucene 文档评分score机制详解)2008-11-28 19:09
文档的分值代表了该文档在特定查询词下对应的相关性高低,他关联着信息检索向量空间模型中的向量夹角的接近度。一个文档越与查询词相关,得分越高。分值计算公式如下:
score(q,d) = coord(q,d) · queryNorm(q) · ∑ ( tf(t in d) · idf(t)2 · t.getBoost() · norm(t,d) )
t in q
其中
tf(t in d)
这个值衡量着Term在文档中出现的频率,也就是词频。关键词在文档中出现的次数越多,得分越高,这个值在DefaultSimilarity的计算公式如下(词频的平方根):
tf(t in d) = frequency½
idf(t)
代表着该词的逆词频,这个值衡量了该词在整个文档库中出现的频度。这意味着,一个词出现的越少,根据香农的信息公示,他越珍稀。同时将贡献更多的分值给总分值。默认的计算公式如下(其中numDocs代表整个文档的数量,docFreq代表了含有Term t的文档数量):
numDocs
idf(t) = 1 + log ( ––––––––– )
docFreq+1
coord(q,d)
这个分值衡量了文档中含有多少Term。文档中出现的越多,越全,将获得越高的分值。举个例来说,查询“lucene”和"Apache",同时出现两个Term的肯定比只出现一个lucene或者Apache的分值高。这个值是搜索时动态计算的,默认的计算公式如下:
coord(q,d) = overlap / maxOverlap
queryNorm(q)
这个标准化因子用于在多个查询器中进行比较。它并不影响文档的排名。它的主要作用在于多个查询器返回的结果进行比较,甚至是结果来自多个索引时。这是搜索时的权重因子,当给查询器设置权重时就是通过这个因子进行影响的。默认的实现公式如下:
1
queryNorm(q) = queryNorm(sumOfSquaredWeights) = ––––––––––––––
sumOfSquaredWeights½
其中的sumOfSquaredWeights的计算公式如下:(可以清晰的看到获取query的boost,当没给查询器设置值时,默认为1,不起作用)
sumOfSquaredWeights = q.getBoost() 2 · ∑ ( idf(t) · t.getBoost() ) 2
t in q
t.getBoost()
该值是一个搜索时权重因子,可以在查询时给不同的Term设置不同的权重,可以通过lucene语法(具体参见我翻译的另外一篇文章:hi.baidu.com/expertsearch/blog/item/8d4f7d355a2e413c5ab5f547.html),也可以通过setBost()函数,注意,在多Term查询器中,是没有获取单一Term权重的函数的,所以如果需要获取,只能调用相应的子查询器函数的getBoost()函数。
norm(t,d)
封装了一些索引时因子以及长度因子。
Document boost - 在索引时,添加到Index前可以通过doc.setBoost()设置,衡量了Document的重要程度。.
Field boost - 在将字段加入到文档前可以通过调用field.setBoost()来设置字段的权重。
lengthNorm(field) - 该值在将文档添加到索引时,根据所有文档中特定字段的Term数来计算。所以默认更短的字段将贡献更多的分值。
1
lengthNorm(field) = ––––––––––––––
numTerms½
当文档加入索引时,以上因子将相乘,如果一个文档中有多个同名的字段,那么将多个多同的权重也相乘。
norm(t,d) = doc.getBoost() · lengthNorm(field) · ∏ f.getBoost()
field f in d named as t
可是还有件值得注意的事情,这个值在索引时计算完毕后将编码为一个Byte存储起来,在搜索时,再从文件中读取出该值并解码成float。在这个过程中,可能会造成精度的缺失,并不能保证decode(encode(x)) = x,比如,有可能decode(encode(0.89)) = 0.75,同样值得注意的是,在搜索时改变此值已经太晚了。例如,用一个不同于DefaultSimilarity的实现。
相关函数:
setDefault(Similarity), IndexWriter.setSimilarity(Similarity), Searcher.setSimilarity(Similarity)
分享到:
相关推荐
- **Scoring**: Lucene的评分机制,基于TF-IDF等算法评估文档的相关性。 3. **高级特性**: - **MultiFieldQueryParser**:允许在一个Document的多个Field中进行搜索。 - **Filter**和**QueryWrapperFilter**...
Lucene允许根据文档的评分(score)或者自定义字段进行排序。评分是基于查询与文档的相关性计算得出的,可以通过Similarity类进行调整。此外,还可以使用FieldDoc排序,依据文档中的某个字段值进行排序。 五、其他...
标题与描述均聚焦于“Lucene搜索过程源码解析—Score树”,这表明文章将深入探讨Lucene这一流行的信息检索库在实现搜索功能时的核心机制之一:Score树。Lucene是一个开源的全文检索引擎工具包,它提供了创建索引、...
- **评分函数(Scoring)**: Lucene使用TF-IDF等算法来计算文档的相关性分数。 - **高亮(Highlighting)**: Lucene提供Highlighter类,用于在搜索结果中突出显示匹配的部分。 ### 4. 应用场景 Lucene广泛应用于...
7. **搜索相关度评分(Score)**:Lucene为每个匹配查询的文档计算一个分数,表示其与查询的相似度。分数的计算涉及多个因素,包括词频(tf)、逆文档频率(idf)、激励因子(boost)和长度规范(lengthNorm)。高...
6. **搜索器(Searcher)**: 搜索器执行查询,根据索引返回匹配的文档,并根据评分(relevancy score)排序。 **Lucene 示例与 Demo** "lucene示例"通常包含了演示如何使用 Lucene 的代码片段或完整的应用。这些...
7. 文档评分(Score):Lucene根据查询的相关性对结果进行评分。 二、功能特性 1. 全文检索:支持对文本的精确匹配、模糊匹配、短语查询等多种检索方式。 2. 高效性能:通过倒排索引实现快速的查询响应。 3. 空间...
它包含符合条件的Document的内部编号(doc)及评分(score)。 5) 示例代码: //keyword要搜索的关键字。indexDir索引存放的目录 public static void searcher(String keyword, File indexDir){ IndexSearcher ...
9. **Score**:Lucene根据文档与查询的相关性给出一个分数,得分最高的文档被认为是最相关的。 10. **Hit** 和 **Hits**:Hit表示单个搜索结果,而Hits是所有匹配结果的集合。 11. **Filter**:可以用于进一步筛选...
4. **匹配与排序**: Lucene 使用这些查询词在索引中查找匹配的文档,根据评分(Relevance Score)对结果进行排序。 5. **返回结果**: 最后,系统返回得分最高的若干文档作为搜索结果。 ### 3. Lucene 支持的文档...
- 使用自定义ScoreFunction:根据业务需求,自定义评分函数,使搜索结果更符合用户期望。 - 利用Filter和QueryWrapperFilter:过滤无关文档,提升搜索效率。 五、总结 通过对“lucene全文检索案例源码”的学习,...
Lucene支持两种类型的排序:基于评分(Score Sorting)和基于字段(Field Sorting)。基于评分的排序默认按照相关性排序,即每个文档与查询匹配的程度。而基于字段的排序则可以根据文档的特定字段值进行排序,如日期...
- **结果排序**:根据文档的评分(Score)对搜索结果进行排序,评分计算涉及到 `Similarity` 类的实现。 - **结果获取**:最后,使用 `Document` 对象从索引中读取搜索结果中的详细信息。 **3. Lucene 源码学习...
- **TopDocs**: 返回匹配的文档集合,通常包括最高评分的一定数量的文档。 **5. 扩展与优化** Lucene 提供了多种扩展点,比如自定义 Analyzer、Filter 和 Collector,以适应不同场景的需求。例如,可以通过自定义 ...
2. **缓存策略**:利用Lucene的缓存机制,如TermVectorCache和DocumentCache,提升查询速度。 3. **倒排索引优化**:通过调整段合并策略和位图索引,进一步提升搜索效率。 4. **实时索引**:结合NRT(Near Real ...
Lucene 支持基于评分(Score)、文档ID或自定义字段的排序。使用 `Sort` 类定义排序规则,并在执行查询时传递给 `IndexSearcher`。 5. **性能优化** - **批量索引**:一次处理大量文档比逐个添加更高效。 - **...
同时,我们还可以使用评分函数(ScoreFunction)和自定义比较器(Comparator)实现复杂的排序逻辑。 5. **高亮显示**:在搜索结果中,通常需要突出显示匹配的关键词。Lucene的Highlighter组件可以自动完成这个任务...
- **Score**:Lucene会根据相关性对结果进行评分,高分代表更相关。 - ** Hits**:查询结果集,包括匹配的文档及其分数。 - **Hit**:单个匹配的文档,包括文档ID、分数和其他相关信息。 4. **Compass检索框架**...
除此之外,还可以通过自定义ScoreFunction或使用BM25等更复杂的评分模型来调整排序规则。 在"luceneDemo4.0"中,你将会看到以上概念的具体应用,包括创建索引、执行查询、高亮展示结果以及调整排序逻辑的示例代码。...
接下来,我们将关注Lucene的排序和评分机制。默认情况下,Lucene根据相关性对搜索结果进行排序,这涉及到TF-IDF算法。我们可能需要定制ScoreFunction或者使用CustomScoreQuery来自定义评分规则,以满足特定业务需求...