我正在尝试更改apache-lucene 5.3中的评分,对于我的公式,我需要文档长度(文档中的令牌数量)。我从类似问题的答案中了解到,你没有一个简单的方法来做到这一点。因为lucene并没有把它保持在索引中。所以我想也许在索引时,我会创建一个从docID到文档长度的Map,然后在查询评估中使用它。但是,我不知道我应该把这个地图放在哪里,也不知道我会在哪里更新它
你说得没错,当文档被索引时存储它是最好的方法。存储它的位置在规范中(不要与queryNorm混淆,这是不同的)。范数提供与字段一起存储的单个值,该值在查询时可用于评分。
在您的Similarity
实现中,这应该进入ComputeNorm
方法,该方法通过FieldInvertState
,特别是FieldInvertState.getLength()
公开您需要的信息。规范在搜索时通过LeafReader.GetNormValues
提供。
如果要扩展TFIDFSimilarity
,则只需要实现encodeNormValue
、decodeNormValue
和lengthNorm
方法。