【发布时间】:2011-09-23 12:12:58
【问题描述】:
我想弄清楚有效载荷评分在 lucene 中的工作原理。由于我不明白 PayloadFunction 适合的位置,我想我并不真正了解它是如何工作的。尝试用谷歌搜索它,但除了建议通过源代码之外找不到太多。好吧,如果有人可以在这里解释它会很好,否则它是源代码:)
【问题讨论】:
我想弄清楚有效载荷评分在 lucene 中的工作原理。由于我不明白 PayloadFunction 适合的位置,我想我并不真正了解它是如何工作的。尝试用谷歌搜索它,但除了建议通过源代码之外找不到太多。好吧,如果有人可以在这里解释它会很好,否则它是源代码:)
【问题讨论】:
它分为三个部分。首先,您应该在分析期间生成有效载荷。这可以使用PayloadAttribute 来完成。您只需在分析期间将此属性添加到您想要的术语中。
class MyFilter extends TokenFilter {
private PayloadAttribute attr;
public MyFilter() {
attr = addAttribute(PayloadAttribute.class);
}
public final boolean incrementToken() throws IOException {
if (input.incrementToken()) {
Payload p = new Payload(PayloadHelper.encodeFloat(42));
attr.setPayload(p);
} else {
attr.setPayload(null);
}
}
那么在搜索过程中你应该使用特殊的查询类PayloadTermQuery。此类的行为与SpanTermQuery 相同,但会跟踪索引中的有效负载。使用自定义 Similarity 实现,您可以对文档中出现的每个有效负载进行评分。
public class MySimilarity extends DefaultSimilarity {
public float scorePayload(int docID, String fieldName,
int start, int end, byte[] payload,
int offset, int length) {
if (payload != null) {
return PayloadHelper.decodeFloat(payload, offset);
} else {
return 1.0f;
}
}
}
最后,使用PayloadFunction,您可以汇总文档上的有效负载分数以生成最终文档分数。
【讨论】: