package querqy.lucene.rewrite; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.MockAnalyzer; import org.apache.lucene.analysis.core.KeywordAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.RandomIndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.search.*; import org.apache.lucene.search.similarities.Similarity; import org.apache.lucene.store.Directory; import org.apache.lucene.util.LuceneTestCase; import org.junit.Test; import org.mockito.Matchers; import java.util.HashSet; import java.util.Set; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; /** * Created by rene on 11/09/2016. */ public class TermBoostQueryTest extends LuceneTestCase { @Test public void testThatWeightGetsScoreFromFieldBoost() throws Exception { final float fieldBoostFactor = 2f; ConstantFieldBoost fieldBoost = new ConstantFieldBoost(fieldBoostFactor); Analyzer analyzer = new MockAnalyzer(random()); Directory directory = newDirectory(); RandomIndexWriter indexWriter = new RandomIndexWriter(random(), directory, analyzer); indexWriter.close(); IndexReader indexReader = DirectoryReader.open(directory); IndexSearcher indexSearcher = newSearcher(indexReader); final TermBoostQuery tbq = new TermBoostQuery(new Term("f1", "v1"), fieldBoost); final Weight weight = tbq.createWeight(indexSearcher, true); assertTrue(weight instanceof TermBoostQuery.TermBoostWeight); final TermBoostQuery.TermBoostWeight tbw = (TermBoostQuery.TermBoostWeight) weight; assertEquals(fieldBoostFactor, tbw.getUnnormalizedScore(), 0.0001f); indexReader.close(); directory.close(); analyzer.close(); } @Test public void testExtractTerms() throws Exception { Analyzer analyzer = new MockAnalyzer(random()); Directory directory = newDirectory(); RandomIndexWriter indexWriter = new RandomIndexWriter(random(), directory, analyzer); TestUtil.addNumDocs("f1", "v1", indexWriter, 1); indexWriter.close(); IndexReader indexReader = DirectoryReader.open(directory); IndexSearcher indexSearcher = newSearcher(indexReader); final Set<Term> terms = new HashSet<>(); final Term term = new Term("f1", "v1"); new TermBoostQuery(term, new ConstantFieldBoost(1f)) .createWeight(indexSearcher, true) .extractTerms(terms); assertTrue(terms.contains(term)); indexReader.close(); directory.close(); analyzer.close(); } @Test public void testThatSimilarityIsNotUsed() throws Exception { ConstantFieldBoost fieldBoost = new ConstantFieldBoost(1f); Analyzer analyzer = new MockAnalyzer(random()); Directory directory = newDirectory(); RandomIndexWriter indexWriter = new RandomIndexWriter(random(), directory, analyzer); TestUtil.addNumDocs("f1", "v1", indexWriter, 1); indexWriter.close(); IndexReader indexReader = DirectoryReader.open(directory); IndexSearcher indexSearcher = newSearcher(indexReader); Similarity similarity = mock(Similarity.class); indexSearcher.setSimilarity(similarity); TermBoostQuery termBoostQuery = new TermBoostQuery(new Term("f1", "v1"), fieldBoost); indexSearcher.search(termBoostQuery, 10); verify(similarity, never()).computeWeight( Matchers.any(CollectionStatistics.class), Matchers.<TermStatistics>anyVararg() ); indexReader.close(); directory.close(); analyzer.close(); } @Test public void testThatResultsAreStillFound() throws Exception { ConstantFieldBoost fieldBoost = new ConstantFieldBoost(1f); Analyzer analyzer = new KeywordAnalyzer(); Directory directory = newDirectory(); RandomIndexWriter indexWriter = new RandomIndexWriter(random(), directory, analyzer); TestUtil.addNumDocs("f1", "v1", indexWriter, 1); TestUtil.addNumDocs("f1", "v2", indexWriter, 1); indexWriter.close(); IndexReader indexReader = DirectoryReader.open(directory); IndexSearcher indexSearcher = newSearcher(indexReader); TermBoostQuery termBoostQuery = new TermBoostQuery(new Term("f1", "v1"), fieldBoost); TopDocs topDocs = indexSearcher.search(termBoostQuery, 10); assertEquals(1, topDocs.totalHits); Document resultDoc = indexSearcher.doc(topDocs.scoreDocs[0].doc); assertEquals("v1", resultDoc.get("f1")); indexReader.close(); directory.close(); analyzer.close(); } }