Skip to content

Instantly share code, notes, and snippets.

@benoitf
Created October 30, 2017 15:30
Show Gist options
  • Save benoitf/6078a0a8925826d8c89916a78a883cb0 to your computer and use it in GitHub Desktop.
Save benoitf/6078a0a8925826d8c89916a78a883cb0 to your computer and use it in GitHub Desktop.
package test.lucene;
import static org.testng.Assert.assertNotNull;
import java.io.IOException;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.LowerCaseFilter;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.core.WhitespaceTokenizer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.SearcherFactory;
import org.apache.lucene.search.SearcherManager;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.RAMDirectory;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* @author Florent Benoit
*/
public class LuceneSearcherTest {
private static final String NAME_FIELD = "name";
private IndexWriter luceneIndexWriter;
private RAMDirectory ramDirectory;
private DirectoryReader luceneIndexReader;
private SearcherManager searcherManager;
@BeforeMethod
public void init() throws IOException {
ramDirectory = new RAMDirectory();
luceneIndexWriter = new IndexWriter(ramDirectory, new IndexWriterConfig(makeAnalyzer()));
}
protected void addFile(String name) throws IOException {
final Document doc = new Document();
doc.add(new TextField(NAME_FIELD, name, Field.Store.YES));
luceneIndexWriter.addDocument(doc);
luceneIndexWriter.commit();
}
protected Analyzer makeAnalyzer() {
return new Analyzer() {
@Override
protected TokenStreamComponents createComponents(String fieldName) {
Tokenizer tokenizer = new WhitespaceTokenizer();
TokenStream filter = new LowerCaseFilter(tokenizer);
return new TokenStreamComponents(tokenizer, filter);
}
};
}
protected long search(String name) throws IOException, ParseException {
luceneIndexReader = DirectoryReader.open(luceneIndexWriter.getDirectory());
searcherManager = new SearcherManager(luceneIndexWriter, new SearcherFactory());
IndexSearcher indexSearcher = searcherManager.acquire();
Query luceneQuery = createLuceneQuery(name);
TopDocs topDocs = indexSearcher.search(luceneQuery, 100);
assertNotNull(topDocs);
return topDocs.totalHits;
}
private Query createLuceneQuery(String name) throws ParseException {
BooleanQuery.Builder luceneQueryBuilder = new BooleanQuery.Builder();
QueryParser qParser = new QueryParser(NAME_FIELD, makeAnalyzer());
luceneQueryBuilder.add(qParser.parse(name), BooleanClause.Occur.MUST);
BooleanQuery booleanQuery = luceneQueryBuilder.build();
System.out.println("Query: " + booleanQuery.toString());
return booleanQuery;
}
@DataProvider
public Object[][] searchByName() {
return new Object[][] {
{"prefixFileName.txt", "prefixF*"},
{"prefixFileName.txt", "prefix*"},
{"name.with.dot.txt", "name.With.Dot.txt"},
{"sameName.txt", "sameName.txt"},
{"notCaseSensitive.txt", "notcasesensitive.txt"},
{"fullName.txt", "full*"},
{"file name.txt", "file name"},
};
}
@Test(dataProvider = "searchByName")
public void searchFileByName(String fileName, String searchedFileName) throws Exception {
// first, add the file
addFile(fileName);
// then search
long result = search(searchedFileName);
Assert.assertEquals(result, 1, "Invalid number when searching file named '" + searchedFileName + "' while filename was '" + fileName + "'.");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment