Index: solr/src/test/org/apache/solr/search/function/TestFunctionQuery.java =================================================================== --- solr/src/test/org/apache/solr/search/function/TestFunctionQuery.java (revision 1068958) +++ solr/src/test/org/apache/solr/search/function/TestFunctionQuery.java (working copy) @@ -299,7 +299,7 @@ state.setBoost(1.0f); state.setLength(4); assertQ(req("fl","*,score","q", "{!func}norm(a_t)", "fq","id:2"), - "//float[@name='score']='" + similarity.computeNorm("a_t",state) + "'"); // sqrt(4)==2 and is exactly representable when quantized to a byte + "//float[@name='score']='" + similarity.computeNorm(state) + "'"); // sqrt(4)==2 and is exactly representable when quantized to a byte // test that ord and rord are working on a global index basis, not just // at the segment level (since Lucene 2.9 has switched to per-segment searching) Index: lucene/src/test/org/apache/lucene/search/payloads/TestPayloadNearQuery.java =================================================================== --- lucene/src/test/org/apache/lucene/search/payloads/TestPayloadNearQuery.java (revision 1068958) +++ lucene/src/test/org/apache/lucene/search/payloads/TestPayloadNearQuery.java (working copy) @@ -299,14 +299,14 @@ // must be static for weight serialization tests static class BoostingSimilarity extends DefaultSimilarity { - @Override public float scorePayload(int docId, String fieldName, int start, int end, byte[] payload, int offset, int length) { + @Override public float scorePayload(int docId, int start, int end, byte[] payload, int offset, int length) { //we know it is size 4 here, so ignore the offset/length return payload[offset]; } //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //Make everything else 1 so we see the effect of the payload //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - @Override public float computeNorm(String fieldName, FieldInvertState state) { + @Override public float computeNorm(FieldInvertState state) { return state.getBoost(); } Index: lucene/src/test/org/apache/lucene/search/payloads/TestPayloadTermQuery.java =================================================================== --- lucene/src/test/org/apache/lucene/search/payloads/TestPayloadTermQuery.java (revision 1068958) +++ lucene/src/test/org/apache/lucene/search/payloads/TestPayloadTermQuery.java (working copy) @@ -287,7 +287,7 @@ // TODO: Remove warning after API has been finalized @Override - public float scorePayload(int docId, String fieldName, int start, int end, byte[] payload, int offset, int length) { + public float scorePayload(int docId, int start, int end, byte[] payload, int offset, int length) { //we know it is size 4 here, so ignore the offset/length return payload[offset]; } @@ -296,7 +296,7 @@ //Make everything else 1 so we see the effect of the payload //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @Override - public float computeNorm(String fieldName, FieldInvertState state) { + public float computeNorm(FieldInvertState state) { return state.getBoost(); } Index: lucene/src/test/org/apache/lucene/search/JustCompileSearch.java =================================================================== --- lucene/src/test/org/apache/lucene/search/JustCompileSearch.java (revision 1068958) +++ lucene/src/test/org/apache/lucene/search/JustCompileSearch.java (working copy) @@ -248,7 +248,7 @@ } @Override - public float computeNorm(String fieldName, FieldInvertState state) { + public float computeNorm(FieldInvertState state) { throw new UnsupportedOperationException(UNSUPPORTED_MSG); } Index: lucene/src/test/org/apache/lucene/search/TestDisjunctionMaxQuery.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestDisjunctionMaxQuery.java (revision 1068958) +++ lucene/src/test/org/apache/lucene/search/TestDisjunctionMaxQuery.java (working copy) @@ -62,7 +62,7 @@ } @Override - public float computeNorm(String fieldName, FieldInvertState state) { + public float computeNorm(FieldInvertState state) { // Disable length norm return state.getBoost(); } Index: lucene/src/test/org/apache/lucene/search/TestSimilarity.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestSimilarity.java (revision 1068958) +++ lucene/src/test/org/apache/lucene/search/TestSimilarity.java (working copy) @@ -40,7 +40,7 @@ public class TestSimilarity extends LuceneTestCase { public static class SimpleSimilarity extends Similarity implements SimilarityProvider { - @Override public float computeNorm(String field, FieldInvertState state) { return state.getBoost(); } + @Override public float computeNorm(FieldInvertState state) { return state.getBoost(); } @Override public float tf(float freq) { return freq; } @Override public float sloppyFreq(int distance) { return 2.0f; } @Override public float idf(int docFreq, int numDocs) { return 1.0f; } Index: lucene/src/test/org/apache/lucene/search/TestSimilarityProvider.java =================================================================== --- lucene/src/test/org/apache/lucene/search/TestSimilarityProvider.java (revision 1068958) +++ lucene/src/test/org/apache/lucene/search/TestSimilarityProvider.java (working copy) @@ -107,7 +107,7 @@ private class Sim1 extends Similarity { @Override - public float computeNorm(String field, FieldInvertState state) { + public float computeNorm(FieldInvertState state) { return 1f; } @@ -129,7 +129,7 @@ private class Sim2 extends Similarity { @Override - public float computeNorm(String field, FieldInvertState state) { + public float computeNorm(FieldInvertState state) { return 10f; } Index: lucene/src/test/org/apache/lucene/index/TestIndexReaderCloneNorms.java =================================================================== --- lucene/src/test/org/apache/lucene/index/TestIndexReaderCloneNorms.java (revision 1068958) +++ lucene/src/test/org/apache/lucene/index/TestIndexReaderCloneNorms.java (working copy) @@ -43,7 +43,7 @@ private class SimilarityOne extends DefaultSimilarity { @Override - public float computeNorm(String fieldName, FieldInvertState state) { + public float computeNorm(FieldInvertState state) { // diable length norm return state.getBoost(); } Index: lucene/src/test/org/apache/lucene/index/TestMaxTermFrequency.java =================================================================== --- lucene/src/test/org/apache/lucene/index/TestMaxTermFrequency.java (revision 1068958) +++ lucene/src/test/org/apache/lucene/index/TestMaxTermFrequency.java (working copy) @@ -109,7 +109,7 @@ } @Override - public float computeNorm(String field, FieldInvertState state) { + public float computeNorm(FieldInvertState state) { return (float) state.getMaxTermFrequency(); } } Index: lucene/src/test/org/apache/lucene/index/TestOmitTf.java =================================================================== --- lucene/src/test/org/apache/lucene/index/TestOmitTf.java (revision 1068958) +++ lucene/src/test/org/apache/lucene/index/TestOmitTf.java (working copy) @@ -36,7 +36,7 @@ public class TestOmitTf extends LuceneTestCase { public static class SimpleSimilarity extends Similarity implements SimilarityProvider { - @Override public float computeNorm(String field, FieldInvertState state) { return state.getBoost(); } + @Override public float computeNorm(FieldInvertState state) { return state.getBoost(); } @Override public float tf(float freq) { return freq; } @Override public float sloppyFreq(int distance) { return 2.0f; } @Override public float idf(int docFreq, int numDocs) { return 1.0f; } Index: lucene/src/test/org/apache/lucene/index/TestNorms.java =================================================================== --- lucene/src/test/org/apache/lucene/index/TestNorms.java (revision 1068958) +++ lucene/src/test/org/apache/lucene/index/TestNorms.java (working copy) @@ -42,7 +42,7 @@ private class SimilarityOne extends DefaultSimilarity { @Override - public float computeNorm(String fieldName, FieldInvertState state) { + public float computeNorm(FieldInvertState state) { // Disable length norm return state.getBoost(); } @@ -252,7 +252,7 @@ } @Override - public float computeNorm(String field, FieldInvertState state) { + public float computeNorm(FieldInvertState state) { return (float) state.getLength(); } } Index: lucene/src/java/org/apache/lucene/search/Similarity.java =================================================================== --- lucene/src/java/org/apache/lucene/search/Similarity.java (revision 1068958) +++ lucene/src/java/org/apache/lucene/search/Similarity.java (working copy) @@ -561,49 +561,13 @@ * Thus they have limited precision, and documents * must be re-indexed if this method is altered. * - *

For backward compatibility this method by default calls - * {@link #lengthNorm(String, int)} passing - * {@link FieldInvertState#getLength()} as the second argument, and - * then multiplies this value by {@link FieldInvertState#getBoost()}.

- * * @lucene.experimental * - * @param field field name * @param state current processing state for this field * @return the calculated float norm */ - public abstract float computeNorm(String field, FieldInvertState state); + public abstract float computeNorm(FieldInvertState state); - /** Computes the normalization value for a field given the total number of - * terms contained in a field. These values, together with field boosts, are - * stored in an index and multipled into scores for hits on each field by the - * search code. - * - *

Matches in longer fields are less precise, so implementations of this - * method usually return smaller values when numTokens is large, - * and larger values when numTokens is small. - * - *

Note that the return values are computed under - * {@link org.apache.lucene.index.IndexWriter#addDocument(org.apache.lucene.document.Document)} - * and then stored using - * {@link #encodeNormValue(float)}. - * Thus they have limited precision, and documents - * must be re-indexed if this method is altered. - * - * @param fieldName the name of the field - * @param numTokens the total number of tokens contained in fields named - * fieldName of doc. - * @return a normalization factor for hits on this field of this document - * - * @see org.apache.lucene.document.Field#setBoost(float) - * - * @deprecated Please override computeNorm instead - */ - @Deprecated - public final float lengthNorm(String fieldName, int numTokens) { - throw new UnsupportedOperationException("please use computeNorm instead"); - } - /** Encodes a normalization factor for storage in an index. * *

The encoding uses a three-bit mantissa, a five-bit exponent, and @@ -781,7 +745,6 @@ * The default implementation returns 1. * * @param docId The docId currently being scored. If this value is {@link #NO_DOC_ID_PROVIDED}, then it should be assumed that the PayloadQuery implementation does not provide document information - * @param fieldName The fieldName of the term this payload belongs to * @param start The start position of the payload * @param end The end position of the payload * @param payload The payload byte array to be scored @@ -791,7 +754,7 @@ * */ // TODO: maybe switch this API to BytesRef? - public float scorePayload(int docId, String fieldName, int start, int end, byte [] payload, int offset, int length) + public float scorePayload(int docId, int start, int end, byte [] payload, int offset, int length) { return 1; } Index: lucene/src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java =================================================================== --- lucene/src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java (revision 1068958) +++ lucene/src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java (working copy) @@ -192,7 +192,7 @@ protected void processPayloads(Collection payLoads, int start, int end) { for (final byte[] thePayload : payLoads) { payloadScore = function.currentScore(doc, fieldName, start, end, - payloadsSeen, payloadScore, similarity.scorePayload(doc, fieldName, + payloadsSeen, payloadScore, similarity.scorePayload(doc, spans.start(), spans.end(), thePayload, 0, thePayload.length)); ++payloadsSeen; } Index: lucene/src/java/org/apache/lucene/search/payloads/PayloadTermQuery.java =================================================================== --- lucene/src/java/org/apache/lucene/search/payloads/PayloadTermQuery.java (revision 1068958) +++ lucene/src/java/org/apache/lucene/search/payloads/PayloadTermQuery.java (working copy) @@ -41,7 +41,7 @@ * {@link org.apache.lucene.index.Term} occurs. *

* In order to take advantage of this, you must override - * {@link org.apache.lucene.search.Similarity#scorePayload(int, String, int, int, byte[],int,int)} + * {@link org.apache.lucene.search.Similarity#scorePayload(int, int, int, byte[],int,int)} * which returns 1 by default. *

* Payload scores are aggregated using a pluggable {@link PayloadFunction}. @@ -119,14 +119,14 @@ if (payload != null) { payloadScore = function.currentScore(doc, term.field(), spans.start(), spans.end(), payloadsSeen, payloadScore, - similarity.scorePayload(doc, term.field(), spans.start(), + similarity.scorePayload(doc, spans.start(), spans.end(), payload.bytes, payload.offset, payload.length)); } else { payloadScore = function.currentScore(doc, term.field(), spans.start(), spans.end(), payloadsSeen, payloadScore, - similarity.scorePayload(doc, term.field(), spans.start(), + similarity.scorePayload(doc, spans.start(), spans.end(), null, 0, 0)); Index: lucene/src/java/org/apache/lucene/search/DefaultSimilarity.java =================================================================== --- lucene/src/java/org/apache/lucene/search/DefaultSimilarity.java (revision 1068958) +++ lucene/src/java/org/apache/lucene/search/DefaultSimilarity.java (working copy) @@ -31,7 +31,7 @@ * * @lucene.experimental */ @Override - public float computeNorm(String field, FieldInvertState state) { + public float computeNorm(FieldInvertState state) { final int numTerms; if (discountOverlaps) numTerms = state.getLength() - state.getNumOverlap(); Index: lucene/src/java/org/apache/lucene/index/NormsWriterPerField.java =================================================================== --- lucene/src/java/org/apache/lucene/index/NormsWriterPerField.java (revision 1068958) +++ lucene/src/java/org/apache/lucene/index/NormsWriterPerField.java (working copy) @@ -74,7 +74,7 @@ assert norms.length == upto; norms = ArrayUtil.grow(norms, 1+upto); } - final float norm = similarity.computeNorm(fieldInfo.name, fieldState); + final float norm = similarity.computeNorm(fieldState); norms[upto] = similarity.encodeNormValue(norm); docIDs[upto] = docState.docID; upto++; Index: lucene/src/java/org/apache/lucene/index/IndexReader.java =================================================================== --- lucene/src/java/org/apache/lucene/index/IndexReader.java (revision 1068958) +++ lucene/src/java/org/apache/lucene/index/IndexReader.java (working copy) @@ -1004,8 +1004,8 @@ /** Expert: Resets the normalization factor for the named field of the named * document. The norm represents the product of the field's {@link - * org.apache.lucene.document.Fieldable#setBoost(float) boost} and its {@link Similarity#lengthNorm(String, - * int) length normalization}. Thus, to preserve the length normalization + * org.apache.lucene.document.Fieldable#setBoost(float) boost} and its + * length normalization}. Thus, to preserve the length normalization * values when resetting this, one should base the new value upon the old. * * NOTE: If this field does not store norms, then Index: lucene/src/java/org/apache/lucene/document/AbstractField.java =================================================================== --- lucene/src/java/org/apache/lucene/document/AbstractField.java (revision 1068958) +++ lucene/src/java/org/apache/lucene/document/AbstractField.java (working copy) @@ -76,17 +76,14 @@ * name, all such values are multiplied together. This product is then * used to compute the norm factor for the field. By * default, in the {@link - * org.apache.lucene.search.Similarity#computeNorm(String, - * FieldInvertState)} method, the boost value is multiplied - * by the {@link - * org.apache.lucene.search.Similarity#lengthNorm(String, - * int)} and then + * org.apache.lucene.search.Similarity#computeNorm(FieldInvertState)} method, the boost value is multiplied + * by the length normalization factor and then * rounded by {@link org.apache.lucene.search.Similarity#encodeNormValue(float)} before it is stored in the * index. One should attempt to ensure that this product does not overflow * the range of that encoding. * * @see org.apache.lucene.document.Document#setBoost(float) - * @see org.apache.lucene.search.Similarity#computeNorm(String, FieldInvertState) + * @see org.apache.lucene.search.Similarity#computeNorm(FieldInvertState) * @see org.apache.lucene.search.Similarity#encodeNormValue(float) */ public void setBoost(float boost) { Index: lucene/src/java/org/apache/lucene/document/Fieldable.java =================================================================== --- lucene/src/java/org/apache/lucene/document/Fieldable.java (revision 1068958) +++ lucene/src/java/org/apache/lucene/document/Fieldable.java (working copy) @@ -43,16 +43,14 @@ * name, all such values are multiplied together. This product is then * used to compute the norm factor for the field. By * default, in the {@link - * org.apache.lucene.search.Similarity#computeNorm(String, - * FieldInvertState)} method, the boost value is multiplied - * by the {@link - * org.apache.lucene.search.Similarity#lengthNorm(String, - * int)} and then rounded by {@link org.apache.lucene.search.Similarity#encodeNormValue(float)} before it is stored in the + * org.apache.lucene.search.Similarity#computeNorm(FieldInvertState)} method, the boost value is multiplied + * by the length normalization factor + * and then rounded by {@link org.apache.lucene.search.Similarity#encodeNormValue(float)} before it is stored in the * index. One should attempt to ensure that this product does not overflow * the range of that encoding. * * @see org.apache.lucene.document.Document#setBoost(float) - * @see org.apache.lucene.search.Similarity#computeNorm(String, FieldInvertState) + * @see org.apache.lucene.search.Similarity#computeNorm(FieldInvertState) * @see org.apache.lucene.search.Similarity#encodeNormValue(float) */ void setBoost(float boost); Index: lucene/contrib/instantiated/src/java/org/apache/lucene/store/instantiated/InstantiatedIndexWriter.java =================================================================== --- lucene/contrib/instantiated/src/java/org/apache/lucene/store/instantiated/InstantiatedIndexWriter.java (revision 1068958) +++ lucene/contrib/instantiated/src/java/org/apache/lucene/store/instantiated/InstantiatedIndexWriter.java (working copy) @@ -241,7 +241,7 @@ final FieldInvertState invertState = new FieldInvertState(); invertState.setBoost(eFieldTermDocInfoFactoriesByTermText.getKey().boost * document.getDocument().getBoost()); invertState.setLength(eFieldTermDocInfoFactoriesByTermText.getKey().fieldLength); - final float norm = similarityProvider.get(fieldName).computeNorm(fieldName, invertState); + final float norm = similarityProvider.get(fieldName).computeNorm(invertState); normsByFieldNameAndDocumentNumber.get(fieldName)[document.getDocumentNumber()] = similarityProvider.get(fieldName).encodeNormValue(norm); } else { System.currentTimeMillis(); Index: lucene/contrib/misc/src/test/org/apache/lucene/index/TestFieldNormModifier.java =================================================================== --- lucene/contrib/misc/src/test/org/apache/lucene/index/TestFieldNormModifier.java (revision 1068958) +++ lucene/contrib/misc/src/test/org/apache/lucene/index/TestFieldNormModifier.java (working copy) @@ -44,7 +44,7 @@ /** inverts the normal notion of lengthNorm */ public static SimilarityProvider s = new DefaultSimilarity() { @Override - public float computeNorm(String fieldName, FieldInvertState state) { + public float computeNorm(FieldInvertState state) { return state.getBoost() * (discountOverlaps ? state.getLength() - state.getNumOverlap() : state.getLength()); } }; Index: lucene/contrib/misc/src/test/org/apache/lucene/misc/SweetSpotSimilarityTest.java =================================================================== --- lucene/contrib/misc/src/test/org/apache/lucene/misc/SweetSpotSimilarityTest.java (revision 1068958) +++ lucene/contrib/misc/src/test/org/apache/lucene/misc/SweetSpotSimilarityTest.java (working copy) @@ -20,6 +20,7 @@ import org.apache.lucene.search.DefaultSimilarity; import org.apache.lucene.search.Similarity; +import org.apache.lucene.search.SimilarityProvider; import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.index.FieldInvertState; @@ -30,8 +31,8 @@ public void testSweetSpotComputeNorm() { - SweetSpotSimilarity ss = new SweetSpotSimilarity(); - ss.setLengthNormFactors(1,1,0.5f); + final SweetSpotSimilarity ss = new SweetSpotSimilarity(); + ss.setLengthNormFactors(1,1,0.5f,true); Similarity d = new DefaultSimilarity(); Similarity s = ss; @@ -43,28 +44,28 @@ for (int i = 1; i < 1000; i++) { invertState.setLength(i); assertEquals("base case: i="+i, - d.computeNorm("foo", invertState), - s.computeNorm("foo", invertState), + d.computeNorm(invertState), + s.computeNorm(invertState), 0.0f); } // make a sweet spot - ss.setLengthNormFactors(3,10,0.5f); + ss.setLengthNormFactors(3,10,0.5f,true); for (int i = 3; i <=10; i++) { invertState.setLength(i); assertEquals("3,10: spot i="+i, 1.0f, - s.computeNorm("foo", invertState), + s.computeNorm(invertState), 0.0f); } for (int i = 10; i < 1000; i++) { invertState.setLength(i-9); - final float normD = d.computeNorm("foo", invertState); + final float normD = d.computeNorm(invertState); invertState.setLength(i); - final float normS = s.computeNorm("foo", invertState); + final float normS = s.computeNorm(invertState); assertEquals("3,10: 10 ln_maxs = new HashMap(7); - private Map ln_mins = new HashMap(7); - private Map ln_steeps = new HashMap(7); - private Map ln_overlaps = new HashMap(7); - private float tf_base = 0.0f; private float tf_min = 0.0f; @@ -98,55 +90,31 @@ * Sets the default function variables used by lengthNorm when no field * specific variables have been set. * - * @see #lengthNorm + * @see #computeLengthNorm */ - public void setLengthNormFactors(int min, int max, float steepness) { + public void setLengthNormFactors(int min, int max, float steepness, boolean discountOverlaps) { this.ln_min = min; this.ln_max = max; this.ln_steep = steepness; + this.discountOverlaps = discountOverlaps; } - - /** - * Sets the function variables used by lengthNorm for a specific named field. - * - * @param field field name - * @param min minimum value - * @param max maximum value - * @param steepness steepness of the curve - * @param discountOverlaps if true, numOverlapTokens will be - * subtracted from numTokens; if false then - * numOverlapTokens will be assumed to be 0 (see - * {@link DefaultSimilarity#computeNorm(String, FieldInvertState)} for details). - * - * @see #lengthNorm - */ - public void setLengthNormFactors(String field, int min, int max, - float steepness, boolean discountOverlaps) { - ln_mins.put(field, Integer.valueOf(min)); - ln_maxs.put(field, Integer.valueOf(max)); - ln_steeps.put(field, Float.valueOf(steepness)); - ln_overlaps.put(field, new Boolean(discountOverlaps)); - } /** * Implemented as state.getBoost() * - * lengthNorm(fieldName, numTokens) where + * computeLengthNorm(numTokens) where * numTokens does not count overlap tokens if * discountOverlaps is true by default or true for this * specific field. */ @Override - public float computeNorm(String fieldName, FieldInvertState state) { + public float computeNorm(FieldInvertState state) { final int numTokens; - boolean overlaps = discountOverlaps; - if (ln_overlaps.containsKey(fieldName)) { - overlaps = ln_overlaps.get(fieldName).booleanValue(); - } - if (overlaps) + + if (discountOverlaps) numTokens = state.getLength() - state.getNumOverlap(); else numTokens = state.getLength(); - return state.getBoost() * computeLengthNorm(fieldName, numTokens); + return state.getBoost() * computeLengthNorm(numTokens); } /** @@ -167,21 +135,11 @@ * * @see #setLengthNormFactors */ - public float computeLengthNorm(String fieldName, int numTerms) { - int l = ln_min; - int h = ln_max; - float s = ln_steep; + public float computeLengthNorm(int numTerms) { + final int l = ln_min; + final int h = ln_max; + final float s = ln_steep; - if (ln_mins.containsKey(fieldName)) { - l = ln_mins.get(fieldName).intValue(); - } - if (ln_maxs.containsKey(fieldName)) { - h = ln_maxs.get(fieldName).intValue(); - } - if (ln_steeps.containsKey(fieldName)) { - s = ln_steeps.get(fieldName).floatValue(); - } - return (float) (1.0f / Math.sqrt Index: lucene/contrib/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java =================================================================== --- lucene/contrib/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java (revision 1068958) +++ lucene/contrib/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java (working copy) @@ -1190,7 +1190,7 @@ int numOverlapTokens = info != null ? info.numOverlapTokens : 0; float boost = info != null ? info.getBoost() : 1.0f; FieldInvertState invertState = new FieldInvertState(0, numTokens, numOverlapTokens, 0, boost); - float n = fieldSim.computeNorm(fieldName, invertState); + float n = fieldSim.computeNorm(invertState); byte norm = fieldSim.encodeNormValue(n); norms = new byte[] {norm};