Skip to content

Instantly share code, notes, and snippets.

@mocobeta
Last active December 11, 2015 18:18
Show Gist options
  • Save mocobeta/4640263 to your computer and use it in GitHub Desktop.
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
/**
* 以下は、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