Skip to content

Instantly share code, notes, and snippets.

@knutwalker
Created December 14, 2013 14:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save knutwalker/7959819 to your computer and use it in GitHub Desktop.
Save knutwalker/7959819 to your computer and use it in GitHub Desktop.
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