Created
December 14, 2013 14:30
-
-
Save knutwalker/7959819 to your computer and use it in GitHub Desktop.
Test case for my answer to http://stackoverflow.com/questions/20567098/lucene-hierarchial-taxonomy-search
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package stackoverflow; | |
import org.apache.lucene.analysis.Analyzer; | |
import org.apache.lucene.analysis.standard.StandardAnalyzer; | |
import org.apache.lucene.document.Document; | |
import org.apache.lucene.document.Field; | |
import org.apache.lucene.document.StringField; | |
import org.apache.lucene.document.TextField; | |
import org.apache.lucene.index.*; | |
import org.apache.lucene.search.*; | |
import org.apache.lucene.store.RAMDirectory; | |
import org.apache.lucene.util.Version; | |
import org.junit.Before; | |
import org.junit.Test; | |
import static org.junit.Assert.assertArrayEquals; | |
import static org.junit.Assert.assertEquals; | |
public class SO20567098Test { | |
private static final Version version = Version.LUCENE_46; | |
private static final Analyzer analyzer = new StandardAnalyzer(version); | |
private static final RAMDirectory dir = new RAMDirectory(); | |
@Before | |
public void setUp() throws Exception { | |
IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig(version, analyzer)); | |
Document doc; | |
doc = new Document(); | |
doc.add(new StringField("id", "1", Field.Store.YES)); | |
doc.add(new TextField("title", "a funny book", Field.Store.YES)); | |
doc.add(new TextField("authors", "Jean Bon", Field.Store.YES)); | |
doc.add(new TextField("authors", "Alex Terieur", Field.Store.YES)); | |
doc.add(new StringField("book_category", "/novel/comedy/new", Field.Store.YES)); | |
writer.addDocument(doc); | |
doc = new Document(); | |
doc.add(new StringField("id", "2", Field.Store.YES)); | |
doc.add(new TextField("title", "a dramatic book", Field.Store.YES)); | |
doc.add(new TextField("authors", "Alex Terieur", Field.Store.YES)); | |
doc.add(new StringField("book_category", "/novel/drama", Field.Store.YES)); | |
writer.addDocument(doc); | |
doc = new Document(); | |
doc.add(new StringField("id", "3", Field.Store.YES)); | |
doc.add(new TextField("title", "a hilarious book", Field.Store.YES)); | |
doc.add(new TextField("authors", "Marc Assin", Field.Store.YES)); | |
doc.add(new TextField("authors", "Harry Covert", Field.Store.YES)); | |
doc.add(new StringField("book_category", "/novel/comedy", Field.Store.YES)); | |
writer.addDocument(doc); | |
doc = new Document(); | |
doc.add(new StringField("id", "4", Field.Store.YES)); | |
doc.add(new TextField("title", "a sad story", Field.Store.YES)); | |
doc.add(new TextField("authors", "Gerard Menvusa", Field.Store.YES)); | |
doc.add(new TextField("authors", "Alex Terieur", Field.Store.YES)); | |
doc.add(new StringField("book_category", "/novel/drama", Field.Store.YES)); | |
writer.addDocument(doc); | |
doc = new Document(); | |
doc.add(new StringField("id", "5", Field.Store.YES)); | |
doc.add(new TextField("title", "A very sad story", Field.Store.YES)); | |
doc.add(new TextField("authors", "Gerard Menvusa", Field.Store.YES)); | |
doc.add(new TextField("authors", "Alain Terieur", Field.Store.YES)); | |
doc.add(new StringField("book_category", "/novel", Field.Store.YES)); | |
writer.addDocument(doc); | |
writer.close(); | |
} | |
@Test | |
public void testSearch() throws Exception { | |
IndexReader reader = DirectoryReader.open(dir); | |
IndexSearcher searcher = new IndexSearcher(reader); | |
float directBoost = 1.0F; | |
float narrowerBoost = 0.8F; | |
float broaderBoost = 0.5F; | |
Query directQuery = new TermQuery(new Term("book_category", "/novel/comedy")); | |
Query narrowerQuery = new RegexpQuery(new Term("book_category", "/novel/comedy/[^/]+")); | |
Query broaderQuery = new TermQuery(new Term("book_category", "/novel")); | |
directQuery = new ConstantScoreQuery(directQuery); | |
narrowerQuery = new ConstantScoreQuery(narrowerQuery); | |
broaderQuery = new ConstantScoreQuery(broaderQuery); | |
directQuery.setBoost(directBoost); | |
narrowerQuery.setBoost(narrowerBoost); | |
broaderQuery.setBoost(broaderBoost); | |
DisjunctionMaxQuery query = new DisjunctionMaxQuery(0.0F); | |
query.add(directQuery); | |
query.add(narrowerQuery); | |
query.add(broaderQuery); | |
assertEquals("(ConstantScore(/novel/comedy) | ConstantScore(//novel/comedy/[^/]+/)^0.8 | ConstantScore(/novel)^0.5)", query.toString("book_category")); | |
TopDocs topDocs = searcher.search(query, 10); | |
assertEquals(3, topDocs.totalHits); | |
String[] hitIds = new String[]{ | |
searcher.doc(topDocs.scoreDocs[0].doc).get("id"), | |
searcher.doc(topDocs.scoreDocs[1].doc).get("id"), | |
searcher.doc(topDocs.scoreDocs[2].doc).get("id")}; | |
assertArrayEquals(new String[] {"3", "1", "5"}, hitIds); | |
float[] scores = new float[]{ | |
topDocs.scoreDocs[0].score, | |
topDocs.scoreDocs[1].score, | |
topDocs.scoreDocs[2].score}; | |
assertArrayEquals(new float[] {directBoost, narrowerBoost, broaderBoost}, scores, 0.00001F); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment