Last active
December 11, 2015 18:18
-
-
Save mocobeta/4640263 to your computer and use it in GitHub Desktop.
Lucene 4.0 Near-real-time search sample (original) "Lucene in Action", Listing 3.3
This file contains hidden or 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
/** | |
* 以下は、Apache Softoware Licence v2.0 の元に頒布されているコードに一部改変を加えたものです。 | |
* http://www.apache.org/licenses/LICENSE-2.0.txt | |
*/ | |
import static org.junit.Assert.*; | |
import java.io.IOException; | |
import org.apache.lucene.analysis.standard.StandardAnalyzer; | |
import org.apache.lucene.document.Document; | |
import org.apache.lucene.document.Field.Store; | |
import org.apache.lucene.document.StringField; | |
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.index.Term; | |
import org.apache.lucene.search.IndexSearcher; | |
import org.apache.lucene.search.Query; | |
import org.apache.lucene.search.TermQuery; | |
import org.apache.lucene.search.TopDocs; | |
import org.apache.lucene.store.Directory; | |
import org.apache.lucene.store.RAMDirectory; | |
import org.apache.lucene.util.Version; | |
import org.junit.Test; | |
public class NearRealTimeTest { | |
@Test | |
public void testNearRealTimeSearch() throws IOException { | |
Directory dir = new RAMDirectory(); | |
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_40, new StandardAnalyzer(Version.LUCENE_40)); | |
IndexWriter writer = new IndexWriter(dir, config); | |
// 10件のドキュメントを作成 | |
for (int i = 0; i < 10; i++) { | |
Document doc = new Document(); | |
doc.add(new StringField("id", ""+i, Store.NO)); | |
doc.add(new TextField("text", "aaa", Store.NO)); | |
writer.addDocument(doc); | |
} | |
// Near-real-time reader を取得 | |
DirectoryReader reader = DirectoryReader.open(writer, true); | |
IndexSearcher searcher = new IndexSearcher(reader); | |
// text = "aaa" で検索すると10件ヒットする | |
Query query = new TermQuery(new Term("text", "aaa")); | |
TopDocs docs = searcher.search(query, 1); | |
assertEquals(10, docs.totalHits); | |
// id = "7" のドキュメントを削除 | |
writer.deleteDocuments(new Term("id", "7")); | |
// 1件の新規ドキュメントを追加 | |
Document doc = new Document(); | |
doc.add(new StringField("id", "11", Store.NO)); | |
doc.add(new TextField("text", "bbb", Store.NO)); | |
writer.addDocument(doc); | |
// reader を開き直す | |
DirectoryReader newReader = DirectoryReader.openIfChanged(reader, writer, true); | |
// 先の reader とは違うオブジェクト | |
assertNotSame(reader, newReader); | |
// 古い reader を閉じる | |
reader.close(); | |
// 新しい reader をラップして searcher を作成 | |
searcher = new IndexSearcher(newReader); | |
// text = "aaa" で検索すると9件ヒットする | |
TopDocs hits = searcher.search(query, 1); | |
assertEquals(9, hits.totalHits); | |
// 新規追加したドキュメントが検索にヒットする | |
query = new TermQuery(new Term("text", "bbb")); | |
hits = searcher.search(query, 1); | |
assertEquals(1, hits.totalHits); | |
writer.close(); | |
} | |
@Test | |
public void testTraditionalSearch() throws IOException { | |
Directory dir = new RAMDirectory(); | |
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_40, new StandardAnalyzer(Version.LUCENE_40)); | |
IndexWriter writer = new IndexWriter(dir, config); | |
// 10件のドキュメントを作成 | |
for (int i = 0; i < 10; i++) { | |
Document doc = new Document(); | |
doc.add(new StringField("id", ""+i, Store.NO)); | |
doc.add(new TextField("text", "aaa", Store.NO)); | |
writer.addDocument(doc); | |
} | |
// コミット | |
writer.commit(); | |
// reader 取得 | |
DirectoryReader reader = DirectoryReader.open(dir); | |
IndexSearcher searcher = new IndexSearcher(reader); | |
// text = "aaa" で検索すると10件ヒットする | |
Query query = new TermQuery(new Term("text", "aaa")); | |
TopDocs docs = searcher.search(query, 1); | |
assertEquals(10, docs.totalHits); | |
// id = "7" のドキュメントを削除 | |
writer.deleteDocuments(new Term("id", "7")); | |
// 1件の新規ドキュメントを追加 | |
Document doc = new Document(); | |
doc.add(new StringField("id", "11", Store.NO)); | |
doc.add(new TextField("text", "bbb", Store.NO)); | |
writer.addDocument(doc); | |
// reader を開き直す | |
DirectoryReader newReader = DirectoryReader.openIfChanged(reader); | |
// index は変更されていない(未コミット)ため null | |
assertNull(newReader); | |
// コミット | |
writer.commit(); | |
// reader を開き直す | |
newReader = DirectoryReader.openIfChanged(reader); | |
// 先の reader とは違うオブジェクト | |
assertNotSame(reader, newReader); | |
// 古い reader を閉じる | |
reader.close(); | |
// 新しい reader をラップして searcher を作成 | |
searcher = new IndexSearcher(newReader); | |
// text = "aaa" で検索すると9件ヒットする | |
TopDocs hits = searcher.search(query, 1); | |
assertEquals(9, hits.totalHits); | |
// 新規追加したドキュメントが検索にヒットする | |
query = new TermQuery(new Term("text", "bbb")); | |
hits = searcher.search(query, 1); | |
assertEquals(1, hits.totalHits); | |
writer.close(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment