BAEL-1160 Introduction to Apache Lucene-Added new sections
This commit is contained in:
parent
bac574a7c2
commit
68eae8ebf4
|
@ -31,7 +31,5 @@
|
|||
<version>4.12</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
|
@ -7,18 +7,22 @@ import java.util.List;
|
|||
import org.apache.lucene.analysis.standard.StandardAnalyzer;
|
||||
import org.apache.lucene.document.Document;
|
||||
import org.apache.lucene.document.Field;
|
||||
import org.apache.lucene.document.SortedDocValuesField;
|
||||
import org.apache.lucene.document.TextField;
|
||||
import org.apache.lucene.index.DirectoryReader;
|
||||
import org.apache.lucene.index.IndexReader;
|
||||
import org.apache.lucene.index.IndexWriter;
|
||||
import org.apache.lucene.index.IndexWriterConfig;
|
||||
import org.apache.lucene.index.Term;
|
||||
import org.apache.lucene.queryparser.classic.ParseException;
|
||||
import org.apache.lucene.queryparser.classic.QueryParser;
|
||||
import org.apache.lucene.search.IndexSearcher;
|
||||
import org.apache.lucene.search.Query;
|
||||
import org.apache.lucene.search.ScoreDoc;
|
||||
import org.apache.lucene.search.Sort;
|
||||
import org.apache.lucene.search.TopDocs;
|
||||
import org.apache.lucene.store.Directory;
|
||||
import org.apache.lucene.util.BytesRef;
|
||||
|
||||
public class InMemoryLuceneIndex {
|
||||
|
||||
|
@ -45,6 +49,7 @@ public class InMemoryLuceneIndex {
|
|||
|
||||
document.add(new TextField("title", title, Field.Store.YES));
|
||||
document.add(new TextField("body", body, Field.Store.YES));
|
||||
document.add(new SortedDocValuesField("title", new BytesRef(title)));
|
||||
|
||||
writter.addDocument(document);
|
||||
writter.close();
|
||||
|
@ -73,6 +78,51 @@ public class InMemoryLuceneIndex {
|
|||
|
||||
}
|
||||
|
||||
public void deleteDocument(Term term) {
|
||||
try {
|
||||
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
|
||||
IndexWriter writter = new IndexWriter(memoryIndex, indexWriterConfig);
|
||||
writter.deleteDocuments(term);
|
||||
writter.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public List<Document> searchIndex(Query query) {
|
||||
try {
|
||||
IndexReader indexReader = DirectoryReader.open(memoryIndex);
|
||||
IndexSearcher searcher = new IndexSearcher(indexReader);
|
||||
TopDocs topDocs = searcher.search(query, 10);
|
||||
List<Document> documents = new ArrayList<>();
|
||||
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
|
||||
documents.add(searcher.doc(scoreDoc.doc));
|
||||
}
|
||||
|
||||
return documents;
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
public List<Document> searchIndex(Query query, Sort sort) {
|
||||
try {
|
||||
IndexReader indexReader = DirectoryReader.open(memoryIndex);
|
||||
IndexSearcher searcher = new IndexSearcher(indexReader);
|
||||
TopDocs topDocs = searcher.search(query, 10, sort);
|
||||
List<Document> documents = new ArrayList<>();
|
||||
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
|
||||
documents.add(searcher.doc(scoreDoc.doc));
|
||||
}
|
||||
|
||||
return documents;
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -4,7 +4,19 @@ import java.util.List;
|
|||
|
||||
import org.apache.lucene.analysis.standard.StandardAnalyzer;
|
||||
import org.apache.lucene.document.Document;
|
||||
import org.apache.lucene.index.Term;
|
||||
import org.apache.lucene.search.BooleanClause;
|
||||
import org.apache.lucene.search.BooleanQuery;
|
||||
import org.apache.lucene.search.FuzzyQuery;
|
||||
import org.apache.lucene.search.PhraseQuery;
|
||||
import org.apache.lucene.search.PrefixQuery;
|
||||
import org.apache.lucene.search.Query;
|
||||
import org.apache.lucene.search.Sort;
|
||||
import org.apache.lucene.search.SortField;
|
||||
import org.apache.lucene.search.TermQuery;
|
||||
import org.apache.lucene.search.WildcardQuery;
|
||||
import org.apache.lucene.store.RAMDirectory;
|
||||
import org.apache.lucene.util.BytesRef;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
|
@ -20,4 +32,121 @@ public class LuceneInMemorySearchTest {
|
|||
Assert.assertEquals("Hello world", documents.get(0).get("title"));
|
||||
}
|
||||
|
||||
}
|
||||
@Test
|
||||
public void givenTermQueryWhenFetchedDocumentThenCorrect() {
|
||||
InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
|
||||
inMemoryLuceneIndex.indexDocument("activity", "running in track");
|
||||
inMemoryLuceneIndex.indexDocument("activity", "Cars are running on road");
|
||||
|
||||
Term term = new Term("body", "running");
|
||||
Query query = new TermQuery(term);
|
||||
|
||||
List<Document> documents = inMemoryLuceneIndex.searchIndex(query);
|
||||
Assert.assertEquals(2, documents.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenPrefixQueryWhenFetchedDocumentThenCorrect() {
|
||||
InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
|
||||
inMemoryLuceneIndex.indexDocument("article", "Lucene introduction");
|
||||
inMemoryLuceneIndex.indexDocument("article", "Introduction to Lucene");
|
||||
|
||||
Term term = new Term("body", "intro");
|
||||
Query query = new PrefixQuery(term);
|
||||
|
||||
List<Document> documents = inMemoryLuceneIndex.searchIndex(query);
|
||||
Assert.assertEquals(2, documents.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenBooleanQueryWhenFetchedDocumentThenCorrect() {
|
||||
InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
|
||||
inMemoryLuceneIndex.indexDocument("Destination", "Las Vegas singapore car");
|
||||
inMemoryLuceneIndex.indexDocument("Commutes in singapore", "Bus Car Bikes");
|
||||
|
||||
Term term1 = new Term("body", "singapore");
|
||||
Term term2 = new Term("body", "car");
|
||||
|
||||
TermQuery query1 = new TermQuery(term1);
|
||||
TermQuery query2 = new TermQuery(term2);
|
||||
|
||||
BooleanQuery booleanQuery = new BooleanQuery.Builder().add(query1, BooleanClause.Occur.MUST)
|
||||
.add(query2, BooleanClause.Occur.MUST).build();
|
||||
|
||||
List<Document> documents = inMemoryLuceneIndex.searchIndex(booleanQuery);
|
||||
Assert.assertEquals(1, documents.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenPhraseQueryWhenFetchedDocumentThenCorrect() {
|
||||
InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
|
||||
inMemoryLuceneIndex.indexDocument("quotes", "A rose by any other name would smell as sweet.");
|
||||
|
||||
Query query = new PhraseQuery(1, "body", new BytesRef("smell"), new BytesRef("sweet"));
|
||||
List<Document> documents = inMemoryLuceneIndex.searchIndex(query);
|
||||
|
||||
Assert.assertEquals(1, documents.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenFuzzyQueryWhenFetchedDocumentThenCorrect() {
|
||||
InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
|
||||
inMemoryLuceneIndex.indexDocument("article", "Halloween Festival");
|
||||
inMemoryLuceneIndex.indexDocument("decoration", "Decorations for Halloween");
|
||||
|
||||
Term term = new Term("body", "hallowen");
|
||||
Query query = new FuzzyQuery(term);
|
||||
|
||||
List<Document> documents = inMemoryLuceneIndex.searchIndex(query);
|
||||
Assert.assertEquals(2, documents.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenWildCardQueryWhenFetchedDocumentThenCorrect() {
|
||||
InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
|
||||
inMemoryLuceneIndex.indexDocument("article", "Lucene introduction");
|
||||
inMemoryLuceneIndex.indexDocument("article", "Introducing Lucene with Spring");
|
||||
|
||||
Term term = new Term("body", "intro*");
|
||||
Query query = new WildcardQuery(term);
|
||||
|
||||
List<Document> documents = inMemoryLuceneIndex.searchIndex(query);
|
||||
Assert.assertEquals(2, documents.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenSortFieldWhenSortedThenCorrect() {
|
||||
InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
|
||||
inMemoryLuceneIndex.indexDocument("Ganges", "River in India");
|
||||
inMemoryLuceneIndex.indexDocument("Mekong", "This river flows in south Asia");
|
||||
inMemoryLuceneIndex.indexDocument("Amazon", "Rain forest river");
|
||||
inMemoryLuceneIndex.indexDocument("Rhine", "Belongs to Europe");
|
||||
inMemoryLuceneIndex.indexDocument("Nile", "Longest River");
|
||||
|
||||
Term term = new Term("body", "river");
|
||||
Query query = new WildcardQuery(term);
|
||||
|
||||
SortField sortField = new SortField("title", SortField.Type.STRING_VAL, false);
|
||||
Sort sortByTitle = new Sort(sortField);
|
||||
|
||||
List<Document> documents = inMemoryLuceneIndex.searchIndex(query, sortByTitle);
|
||||
Assert.assertEquals(4, documents.size());
|
||||
Assert.assertEquals("Amazon", documents.get(0).getField("title").stringValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenDocumentDeletedThenCorrect() {
|
||||
InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer());
|
||||
inMemoryLuceneIndex.indexDocument("Ganges", "River in India");
|
||||
inMemoryLuceneIndex.indexDocument("Mekong", "This river flows in south Asia");
|
||||
|
||||
Term term = new Term("title", "ganges");
|
||||
inMemoryLuceneIndex.deleteDocument(term);
|
||||
|
||||
Query query = new TermQuery(term);
|
||||
|
||||
List<Document> documents = inMemoryLuceneIndex.searchIndex(query);
|
||||
Assert.assertEquals(0, documents.size());
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue