mirror of https://github.com/apache/lucene.git
LUCENE-789: fix MultiSearcher to not ignore its custom similarity.
git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@532487 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
d7ea0e5b19
commit
3c60a00b69
|
@ -105,6 +105,11 @@ Bug fixes
|
||||||
13. LUCENE-736: Sloppy phrase query with repeating terms matches wrong docs.
|
13. LUCENE-736: Sloppy phrase query with repeating terms matches wrong docs.
|
||||||
For example query "B C B"~2 matches the doc "A B C D E". (Doron Cohen)
|
For example query "B C B"~2 matches the doc "A B C D E". (Doron Cohen)
|
||||||
|
|
||||||
|
14. LUCENE-789: Fixed: custom similarity is ignored when using MultiSearcher (problem reported
|
||||||
|
by Alexey Lef). Now the similarity applied by MultiSearcer.setSimilarity(sim) is being used.
|
||||||
|
Note that as before this fix, creating a multiSearcher from Searchers for whom custom similarity
|
||||||
|
was set has no effect - it is masked by the similarity of the MultiSearcher. This is as
|
||||||
|
designed, because MultiSearcher operates on Searchables (not Searchers). (Doron Cohen)
|
||||||
|
|
||||||
New features
|
New features
|
||||||
|
|
||||||
|
|
|
@ -43,9 +43,10 @@ public class MultiSearcher extends Searcher {
|
||||||
private Map dfMap; // Map from Terms to corresponding doc freqs
|
private Map dfMap; // Map from Terms to corresponding doc freqs
|
||||||
private int maxDoc; // document count
|
private int maxDoc; // document count
|
||||||
|
|
||||||
public CachedDfSource(Map dfMap, int maxDoc) {
|
public CachedDfSource(Map dfMap, int maxDoc, Similarity similarity) {
|
||||||
this.dfMap = dfMap;
|
this.dfMap = dfMap;
|
||||||
this.maxDoc = maxDoc;
|
this.maxDoc = maxDoc;
|
||||||
|
setSimilarity(similarity);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int docFreq(Term term) {
|
public int docFreq(Term term) {
|
||||||
|
@ -106,7 +107,7 @@ public class MultiSearcher extends Searcher {
|
||||||
public TopFieldDocs search(Weight weight,Filter filter,int n,Sort sort) {
|
public TopFieldDocs search(Weight weight,Filter filter,int n,Sort sort) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
|
||||||
private Searchable[] searchables;
|
private Searchable[] searchables;
|
||||||
|
@ -320,7 +321,7 @@ public class MultiSearcher extends Searcher {
|
||||||
|
|
||||||
// step4
|
// step4
|
||||||
int numDocs = maxDoc();
|
int numDocs = maxDoc();
|
||||||
CachedDfSource cacheSim = new CachedDfSource(dfMap, numDocs);
|
CachedDfSource cacheSim = new CachedDfSource(dfMap, numDocs, getSimilarity());
|
||||||
|
|
||||||
return rewrittenQuery.weight(cacheSim);
|
return rewrittenQuery.weight(cacheSim);
|
||||||
}
|
}
|
||||||
|
|
|
@ -354,4 +354,42 @@ public class TestMultiSearcher extends TestCase
|
||||||
ramDirectory1.close();
|
ramDirectory1.close();
|
||||||
ramDirectory2.close();
|
ramDirectory2.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test that custom similarity is in effect when using MultiSearcher (LUCENE-789).
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public void testCustomSimilarity () throws IOException {
|
||||||
|
RAMDirectory dir = new RAMDirectory();
|
||||||
|
initIndex(dir, 10, true, "x"); // documents with two tokens "doc0" and "x", "doc1" and x, etc...
|
||||||
|
IndexSearcher srchr = new IndexSearcher(dir);
|
||||||
|
MultiSearcher msrchr = getMultiSearcherInstance(new Searcher[]{srchr});
|
||||||
|
|
||||||
|
Similarity customSimilarity = new DefaultSimilarity() {
|
||||||
|
// overide all
|
||||||
|
public float idf(int docFreq, int numDocs) { return 100.0f; }
|
||||||
|
public float coord(int overlap, int maxOverlap) { return 1.0f; }
|
||||||
|
public float lengthNorm(String fieldName, int numTokens) { return 1.0f; }
|
||||||
|
public float queryNorm(float sumOfSquaredWeights) { return 1.0f; }
|
||||||
|
public float sloppyFreq(int distance) { return 1.0f; }
|
||||||
|
public float tf(float freq) { return 1.0f; }
|
||||||
|
};
|
||||||
|
|
||||||
|
srchr.setSimilarity(customSimilarity);
|
||||||
|
msrchr.setSimilarity(customSimilarity);
|
||||||
|
|
||||||
|
Query query=new TermQuery(new Term("contents", "doc0"));
|
||||||
|
|
||||||
|
// Get a score from IndexSearcher
|
||||||
|
TopDocs topDocs = srchr.search(query, null, 1);
|
||||||
|
float score1 = topDocs.getMaxScore();
|
||||||
|
|
||||||
|
// Get the score from MultiSearcher
|
||||||
|
topDocs = msrchr.search(query, null, 1);
|
||||||
|
float scoreN = topDocs.getMaxScore();
|
||||||
|
|
||||||
|
// The scores from the IndexSearcher and Multisearcher should be the same
|
||||||
|
// if the same similarity is used.
|
||||||
|
assertEquals("MultiSearcher score must be equal to single esrcher score!", score1, scoreN, 1e-6);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue