top / index / prev / next / target / source

2018-12-08 diary: [Java] [Apache] Lucene のあいまい検索のシンプルサンプル

いがぴょんの日記 日記形式でつづる いがぴょんコラム ウェブページです。

[Java] [Apache] Lucene のあいまい検索のシンプルサンプル

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 $

登場キーワード


この日記について