Index: src/java/org/apache/lucene/search/payloads/AveragePayloadFunction.java =================================================================== --- src/java/org/apache/lucene/search/payloads/AveragePayloadFunction.java (revision 911598) +++ src/java/org/apache/lucene/search/payloads/AveragePayloadFunction.java (working copy) @@ -1,5 +1,7 @@ package org.apache.lucene.search.payloads; +import org.apache.lucene.search.Explanation; + /** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -25,6 +27,8 @@ * **/ public class AveragePayloadFunction extends PayloadFunction{ + int numPayloadsSeen=0; + float payloadScore=0; @Override public float currentScore(int docId, String field, int start, int end, int numPayloadsSeen, float currentScore, float currentPayloadScore) { @@ -33,8 +37,19 @@ @Override public float docScore(int docId, String field, int numPayloadsSeen, float payloadScore) { + this.numPayloadsSeen = numPayloadsSeen; + this.payloadScore = payloadScore; return numPayloadsSeen > 0 ? (payloadScore / numPayloadsSeen) : 1; } + + @Override + public Explanation explain(int doc) { + Explanation payloadBoost = new Explanation(); + float avgPayloadScore = (numPayloadsSeen > 0 ? (payloadScore / numPayloadsSeen) : 1); + payloadBoost.setValue(avgPayloadScore); + payloadBoost.setDescription("AveragePayloadFunction(...)"); + return payloadBoost; + } @Override public int hashCode() { Index: src/java/org/apache/lucene/search/payloads/MaxPayloadFunction.java =================================================================== --- src/java/org/apache/lucene/search/payloads/MaxPayloadFunction.java (revision 911598) +++ src/java/org/apache/lucene/search/payloads/MaxPayloadFunction.java (working copy) @@ -1,5 +1,7 @@ package org.apache.lucene.search.payloads; +import org.apache.lucene.search.Explanation; + /** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -25,21 +27,33 @@ * **/ public class MaxPayloadFunction extends PayloadFunction { + int numPayloadsSeen=0; + float payloadScore=0; + @Override - public float currentScore(int docId, String field, int start, int end, int numPayloadsSeen, float currentScore, float currentPayloadScore) { - if (numPayloadsSeen == 0) { - return currentPayloadScore; - } else { - return Math.max(currentPayloadScore, currentScore); + public float currentScore(int docId, String field, int start, int end, int numPayloadsSeen, float currentScore, float currentPayloadScore) { + if (numPayloadsSeen == 0) { + return currentPayloadScore; + } else { + return Math.max(currentPayloadScore, currentScore); + } } - } - @Override + @Override public float docScore(int docId, String field, int numPayloadsSeen, float payloadScore) { - return numPayloadsSeen > 0 ? payloadScore : 1; + this.numPayloadsSeen = numPayloadsSeen; + this.payloadScore = payloadScore; + return numPayloadsSeen > 0 ? payloadScore : 1; + } + @Override + public Explanation explain(int doc) { + Explanation payloadBoost = new Explanation(); + float maxPayloadScore = (numPayloadsSeen > 0 ? payloadScore : 1); + payloadBoost.setValue(maxPayloadScore); + payloadBoost.setDescription("MaxPayloadFunction(...)"); + return payloadBoost; } - - @Override + @Override public int hashCode() { final int prime = 31; int result = 1; @@ -46,7 +60,6 @@ result = prime * result + this.getClass().hashCode(); return result; } - @Override public boolean equals(Object obj) { if (this == obj) Index: src/java/org/apache/lucene/search/payloads/MinPayloadFunction.java =================================================================== --- src/java/org/apache/lucene/search/payloads/MinPayloadFunction.java (revision 911598) +++ src/java/org/apache/lucene/search/payloads/MinPayloadFunction.java (working copy) @@ -1,5 +1,7 @@ package org.apache.lucene.search.payloads; +import org.apache.lucene.search.Explanation; + /** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -22,22 +24,32 @@ * **/ public class MinPayloadFunction extends PayloadFunction { + int numPayloadsSeen=0; + float payloadScore=0; @Override - public float currentScore(int docId, String field, int start, int end, int numPayloadsSeen, float currentScore, float currentPayloadScore) { - if (numPayloadsSeen == 0) { - return currentPayloadScore; - } else { - return Math.min(currentPayloadScore, currentScore); + public float currentScore(int docId, String field, int start, int end, int numPayloadsSeen, float currentScore, float currentPayloadScore) { + if (numPayloadsSeen == 0) { + return currentPayloadScore; + } else { + return Math.min(currentPayloadScore, currentScore); + } } - } @Override public float docScore(int docId, String field, int numPayloadsSeen, float payloadScore) { + this.numPayloadsSeen = numPayloadsSeen; + this.payloadScore = payloadScore; return numPayloadsSeen > 0 ? payloadScore : 1; } - @Override + public Explanation explain(int doc) { + Explanation payloadBoost = new Explanation(); + float maxPayloadScore = (numPayloadsSeen > 0 ? payloadScore : 1); + payloadBoost.setValue(maxPayloadScore); + payloadBoost.setDescription("MinPayloadFunction(...)"); + return payloadBoost; + } public int hashCode() { final int prime = 31; int result = 1; Index: src/java/org/apache/lucene/search/payloads/PayloadFunction.java =================================================================== --- src/java/org/apache/lucene/search/payloads/PayloadFunction.java (revision 911598) +++ src/java/org/apache/lucene/search/payloads/PayloadFunction.java (working copy) @@ -17,6 +17,7 @@ */ import java.io.Serializable; +import org.apache.lucene.search.Explanation; /** * An abstract class that defines a way for Payload*Query instances to transform @@ -21,12 +22,12 @@ /** * An abstract class that defines a way for Payload*Query instances to transform * the cumulative effects of payload scores for a document. - * + * * @see org.apache.lucene.search.payloads.PayloadTermQuery for more information - * + * * @lucene.experimental This class and its derivations are experimental and subject to * change - * + * **/ public abstract class PayloadFunction implements Serializable { @@ -55,6 +56,14 @@ */ public abstract float docScore(int docId, String field, int numPayloadsSeen, float payloadScore); + + public Explanation explain(int docId){ + Explanation result = new Explanation(); + result.setDescription("Unimpl Payload Function Explain"); + result.setValue(1); + return result; + }; + @Override public abstract int hashCode(); Index: src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java =================================================================== --- src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java (revision 911598) +++ src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java (working copy) @@ -79,7 +79,7 @@ newClauses[i] = (SpanQuery) clauses.get(i).clone(); } PayloadNearQuery boostingNearQuery = new PayloadNearQuery(newClauses, slop, - inOrder); + inOrder, function); boostingNearQuery.setBoost(getBoost()); return boostingNearQuery; } @@ -84,7 +84,6 @@ return boostingNearQuery; } - @Override public String toString(String field) { StringBuilder buffer = new StringBuilder(); buffer.append("payloadNear(["); @@ -152,7 +151,6 @@ public class PayloadNearSpanScorer extends SpanScorer { Spans spans; - protected float payloadScore; private int payloadsSeen; Similarity similarity = getSimilarity(); @@ -204,15 +202,22 @@ // @Override protected boolean setFreqCurrentDoc() throws IOException { - if (!more) { - return false; - } - Spans[] spansArr = new Spans[1]; - spansArr[0] = spans; - payloadScore = 0; - payloadsSeen = 0; - getPayloads(spansArr); - return super.setFreqCurrentDoc(); + if (!more) { + return false; + } + doc = spans.doc(); + freq = 0.0f; + payloadScore = 0; + payloadsSeen = 0; + do { + int matchLength = spans.end() - spans.start(); + freq += getSimilarity().sloppyFreq(matchLength); + Spans[] spansArr = new Spans[1]; + spansArr[0] = spans; + getPayloads(spansArr); + more = spans.next(); + } while (more && (doc == spans.doc())); + return true; } @Override @@ -225,16 +230,14 @@ @Override protected Explanation explain(int doc) throws IOException { Explanation result = new Explanation(); + // Add detail about tf/idf... Explanation nonPayloadExpl = super.explain(doc); result.addDetail(nonPayloadExpl); - Explanation payloadBoost = new Explanation(); - result.addDetail(payloadBoost); - float avgPayloadScore = (payloadsSeen > 0 ? (payloadScore / payloadsSeen) - : 1); - payloadBoost.setValue(avgPayloadScore); - payloadBoost.setDescription("scorePayload(...)"); - result.setValue(nonPayloadExpl.getValue() * avgPayloadScore); - result.setDescription("bnq, product of:"); + // Add detail about payload + Explanation payloadExpl = function.explain(doc); + result.addDetail(payloadExpl); + result.setValue(nonPayloadExpl.getValue() * payloadExpl.getValue()); + result.setDescription("PayloadNearQuery, product of:"); return result; } }