top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
Apache Lucene
のあいまい検索のシンプルサンプルです。
import java.io.IOException;
import java.nio.file.Files;
import org.apache.lucene.analysis.Analyzer;
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.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.MMapDirectory;
public class SimpleSample {
public static final String[] INDEX_TEXTS = new String[] { //
"吾輩は猫である。名前はまだ無い。", //
"隣の客はよく柿食う客だ", //
"柿くへば鐘が鳴るなり法隆寺", //
"つれづれなるままに ひくらし すずりにむかいて こころにうつりゆくよしなしごとを そこはかとなくかきつくれば あやしうこそものぐるほしけれ", //
};
public static void main(String[] args) throws IOException {
// 最低限の Lucene 環境一式構築
Directory indexDir = new MMapDirectory(Files.createTempDirectory("lucene").toAbsolutePath());
// Analyzer analyzer = new org.apache.lucene.analysis.standard.StandardAnalyzer();
Analyzer analyzer = new org.apache.lucene.analysis.ja.JapaneseAnalyzer();
System.err.println("Lucene:" + analyzer.getVersion());
// インディックス構築
try (IndexWriter writer = new IndexWriter(indexDir, new IndexWriterConfig(analyzer))) {
for (String text : INDEX_TEXTS) {
Document newDoc = new Document();
newDoc.add(new TextField("text", text, Field.Store.YES));
writer.addDocument(newDoc);
}
}
try {
// インディックス検索
IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(indexDir));
Query query = new QueryParser("text", analyzer).parse("柿");
TopDocs topDocs = searcher.search(query, 10);
// 検索結果の表示
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
System.err.println(scoreDoc.score + ":" + searcher.doc(scoreDoc.doc).get("text"));
}
} catch (ParseException ex) {
throw new IOException(ex);
}
}
}
Maven pom.xml に以下を追記。
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>8.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>8.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-kuromoji</artifactId>
<version>8.1.0</version>
</dependency>
気候が急に冬の気配。風邪をひかないように気をつけます。
Last modified: $Date: 2019-05-18 $