【发布时间】:2016-01-07 13:40:58
【问题描述】:
我正在尝试更改 apache lucene 5.3 中的评分,对于我的公式,我需要文档长度(文档中的标记数)。我从类似问题的答案中了解到,您没有简单的方法来做到这一点。因为 lucene 不会将其保留在索引中。所以我想也许在索引时我会创建一个从 docID 到文档长度的 Map,然后在查询评估中使用它。但是,我不知道我应该把这张地图放在哪里以及我会在哪里更新它。
【问题讨论】:
我正在尝试更改 apache lucene 5.3 中的评分,对于我的公式,我需要文档长度(文档中的标记数)。我从类似问题的答案中了解到,您没有简单的方法来做到这一点。因为 lucene 不会将其保留在索引中。所以我想也许在索引时我会创建一个从 docID 到文档长度的 Map,然后在查询评估中使用它。但是,我不知道我应该把这张地图放在哪里以及我会在哪里更新它。
【问题讨论】:
你说的很对,在文档被索引时存储它是最好的方法。存储它的地方是规范(不要与 queryNorm 混淆,这是不同的东西)。规范提供与字段一起存储的单个值,该值可在查询时用于评分。
在您的Similarity 实现中,这应该进入ComputeNorm 方法,该方法通过FieldInvertState 公开您需要的信息,尤其是FieldInvertState.getLength()。通过LeafReader.GetNormValues 在搜索时提供规范。
如果您要扩展TFIDFSimilarity,则只需实现encodeNormValue、decodeNormValue 和lengthNorm 方法。
【讨论】: