Search 理解Lucene查询
我想更具体地了解一下Lucene查询是如何评分的。在他们的文档中,他们提到了VSM。我熟悉VSM,但它似乎与它们允许的查询类型不一致 我尝试过单步浏览BooleanScorer2和BooleanWeight的源代码,但没有任何实际效果 我的问题是,是否有人可以通过执行BooleanScorer来解释它是如何组合查询的 此外,是否有一种方法可以简单地发送几个术语,然后按照文档中描述的方法获取这些术语的原始tf.idf分数?开始的地方是 我想这能消除你的矛盾吗?Lucene将信息检索的布尔模型(BM)与信息检索的向量空间模型(VSM)相结合,BM“批准”的文档由VSM评分 接下来要看的是Searcher.explain,它可以为您提供一个字符串,解释如何计算(查询、文档)对的分数 我认为,跟踪BooleanScorer的执行过程可能是一个挑战,首先理解BooleanScorer2可能是最容易的,它使用了ConnectionsCorer/DisjunctionSumScorer等子核心,并将BooleanScorer视为一种优化 如果这令人困惑,那么从TermScorer开始更简单。就我个人而言,我认为它是“干杯”:Search 理解Lucene查询,search,lucene,Search,Lucene,我想更具体地了解一下Lucene查询是如何评分的。在他们的文档中,他们提到了VSM。我熟悉VSM,但它似乎与它们允许的查询类型不一致 我尝试过单步浏览BooleanScorer2和BooleanWeight的源代码,但没有任何实际效果 我的问题是,是否有人可以通过执行BooleanScorer来解释它是如何组合查询的 此外,是否有一种方法可以简单地发送几个术语,然后按照文档中描述的方法获取这些术语的原始tf.idf分数?开始的地方是 我想这能消除你的矛盾吗?Lucene将信息检索的布尔模型(BM
- 一个查询在整个索引中创建一个有效的权重:它包含boost、idf、queryNorm,甚至令人困惑的是,包含该术语的任何“外部”/“父级”查询(如booleanquery)的boost。此权重只计算一次
- 权重为每个索引段创建一个计分器(例如TermScorer),对于单个术语,该计分器在公式中拥有它所需的一切,但与文档相关的内容除外:文档内术语频率(TF),它必须从日志中读取,以及文档的长度标准化值(norm)。这就是为什么termscorer将文档评分为weight*sqrt(tf)*norm。实际上,这是为tf值<32而缓存的,因此大多数文档的评分都是一次乘法
- BooleanQuery实际上做的“不多”,除了它的计分员负责下一个Doc()和advance()的子计分员外,当布尔模型满足时,它结合子计分员的分数,根据匹配的子计分员数量应用协调工厂(coord())
- 一个查询在整个索引中创建一个有效的权重:它包含boost、idf、queryNorm,甚至令人困惑的是,包含该术语的任何“外部”/“父级”查询(如booleanquery)的boost。此权重只计算一次
- 权重为每个索引段创建一个计分器(例如TermScorer),对于单个术语,该计分器在公式中拥有它所需的一切,但与文档相关的内容除外:文档内术语频率(TF),它必须从日志中读取,以及文档的长度标准化值(norm)。这就是为什么termscorer将文档评分为weight*sqrt(tf)*norm。实际上,这是为tf值<32而缓存的,因此大多数文档的评分都是一次乘法
- BooleanQuery实际上做的“不多”,除了它的计分员负责下一个Doc()和advance()的子计分员外,当布尔模型满足时,它结合子计分员的分数,根据匹配的子计分员数量应用协调工厂(coord())
一般来说,很难通过lucene对文档进行评分,因为在所有发布的表单中,评分员都负责两件事:匹配和计算分数。在Lucene的后备箱里(http://svn.apache.org/repos/asf/lucene/dev/trunk/)它们现在是分开的,以这样一种方式,相似性基本上负责评分的所有方面,这与匹配是分开的。因此,API可能更容易理解,也可能更难理解,但如果您感到困惑,至少可以参考许多其他评分模型(BM25、语言模型、与随机性的差异、基于信息的模型)的实现:对不起,如果我问你,但是有理由不接受RObert的答案吗?看来他把一切都解释清楚了!对不起,如果我问你,你有理由不接受罗伯特的回答吗?看来他把一切都解释清楚了!