ホームページ > Java > &#&チュートリアル > Java API開発における全文検索処理にApache Luceneを使用する

Java API開発における全文検索処理にApache Luceneを使用する

WBOY
リリース: 2023-06-18 18:11:05
オリジナル
1562 人が閲覧しました

インターネット上のデータ量は増加の一途をたどっており、データをいかに迅速かつ正確に検索するかが重要な課題となっています。この問題に対応して、オープン ソースの全文検索エンジン ライブラリの 1 つである Apache Lucene は、Java プログラミング言語と統合されたアプリケーションに適した全文検索エンジンが登場しました。この記事では、Java API開発における全文検索処理にApache Luceneを使用する方法を紹介します。

1. Apache Lucene の概要

Apache Lucene は全文検索エンジン ライブラリであり、以下に基づいた高性能、フル機能、使いやすい検索エンジン ライブラリです。ジャワ。大量のテキスト データのインデックスを作成し、効率的で正確かつ迅速な検索結果を提供できます。 Lucene は、ディスクベースのインデックス作成テクノロジを使用して、テキスト データを複数の単語に分割し、転置インデックス テーブルに保存します。逆索引テーブルは、単語と文書の間の関係を使用して、単語を、その単語が配置されている文書を指すようにします。クエリ プロセス中に、逆索引テーブルは単語ごとにドキュメントを検索し、それらをクエリ結果として返します。

2. Lucene のコア コンポーネント

Lucene は複数のコア コンポーネントで構成されています。これらのコンポーネントは連携して、次のような高性能の全文検索エンジンを実装します。

  1. Analyzer

Anaylzer は、テキスト データを分割するだけでなく、複数に分割するためにも使用されます。テキストを単語に変換するだけでなく、単語アナライザーを使用してストップワードをフィルタリングしたり、大文字と小文字を変換したりすることもできます。

  1. IndexWriter (インデックス ライター)

IndexWriter は、テキスト データをインデックス テーブルに変換し、逆インデックス テーブルを構築し、それをディスクに保存するために使用されます。データを検索する必要がある場合、インデックステーブルからデータを素早く検索できます。

  1. IndexReader (インデックス リーダー)

IndexReader は、ディスクからインデックス テーブルを読み取り、メモリにロードするために使用されます。データはメモリからロードされるため、データのクエリは非常に高速です。

  1. Query (クエリ)

Query は、ユーザーが入力した文字列を検索条件に変換し、Lucene インデックス テーブル内のデータを迅速に検索するために使用されます。

3. Lucene を使用して全文検索を実装する

  1. Lucene 依存関係の紹介

Maven は、Java 開発で一般的に使用される依存関係管理ツールです。 Maven に次の Lucene 依存関係を追加するだけです。

<dependency>
  <groupId>org.apache.lucene</groupId>
  <artifactId>lucene-core</artifactId>
  <version>8.8.2</version>
</dependency>
ログイン後にコピー
  1. インデックスの作成

IndexWriter を使用してデータをインデックス テーブルに変換します。ここでは、検索対象のデータがデータベースまたはその他のソースから取得されたものであると仮定します。これをテキスト形式に変換し、IndexWriter に追加する必要があります。以下は記事の例です:

import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.FieldType;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import java.nio.file.Paths;

public class Indexer {

    private IndexWriterConfig indexWriterConfig = new IndexWriterConfig(new SmartChineseAnalyzer());
    private IndexWriter indexWriter;

    public Indexer(String indexPath) {
        try {
            Directory directory = FSDirectory.open(Paths.get(indexPath));
            indexWriter = new IndexWriter(directory, indexWriterConfig);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void add(String field, String value) {
        try {
            Document doc = new Document();
            FieldType fieldType = new FieldType();
            fieldType.setIndexOptions(FieldInfo.IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS);
            fieldType.setStored(true);
            fieldType.setTokenized(true);
            doc.add(new Field(field, value, fieldType));
            indexWriter.addDocument(doc);
            indexWriter.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void delete(String field, String value) {
        try {
            indexWriter.deleteDocuments(new Term(field, value));
            indexWriter.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void close() {
        try {
            indexWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
ログイン後にコピー

このクラス内:

  • Indexer コンストラクターで、IndexWriter と Directory を初期化します。ディレクトリはインデックス ライブラリの場所を表します。
  • add() メソッドは、テキスト データをインデックス ライブラリに追加するために使用されます。
  • delete() メソッドは、インデックス ライブラリからテキスト データを削除するために使用されます。
  • close() メソッドは、最後に IndexWriter を閉じるために使用されます。
    #Search
検索操作には Query と IndexReader を使用します。コード例を次に示します。

import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
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.FSDirectory;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class Searcher {

    private String[] fields = new String[] {"title", "content"};
    private Query query;
    private IndexReader indexReader;
    private IndexSearcher indexSearcher;

    public Searcher(String indexPath) {
        try {
            Directory directory = FSDirectory.open(Paths.get(indexPath));
            indexReader = DirectoryReader.open(directory);
            indexSearcher = new IndexSearcher(indexReader);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private Query getQuery(String keyword) {
        try {
            if (query == null) {
                query = new MultiFieldQueryParser(fields, new SmartChineseAnalyzer()).parse(keyword);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return query;
    }

    public List<String> search(String keyword) {
        List<String> result = new ArrayList<String>();
        try {
            TopDocs topDocs = indexSearcher.search(getQuery(keyword), 10);
            ScoreDoc[] scoreDocs = topDocs.scoreDocs;
            for (ScoreDoc scoreDoc : scoreDocs) {
                result.add(indexSearcher.doc(scoreDoc.doc).get("title"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    public void close() {
        try {
            indexReader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
ログイン後にコピー
このクラス内:

    Searcher コンストラクターで、IndexReader と IndexSearcher を初期化します。
  • getQuery()メソッドは、ユーザーが入力した検索条件をQuery型に変換するメソッドです。
  • search() メソッドは検索に使用され、検索操作の実行後に結果を返します。
  • close() メソッドは、最後に IndexReader を閉じるために使用されます。
4. 概要

この記事では、Apache Lucene を介して全文検索機能を実装する方法を紹介し、主に Lucene のコア コンポーネント、Lucene の使用方法、およびメソッドを紹介します。 Lucene のいくつかの一般的なクラス。この記事で説明したクラスとメソッドに加えて、Lucene には、さまざまなニーズに応じて適切に調整して使用できる機能が他にもたくさんあります。 Apache Lucene は、Java 言語による非常に信頼性の高い全文検索エンジン ライブラリであり、多くの分野に適しています。学習と実践を通じて、誰もが実際のアプリケーションで Apache Lucene をより適切に使用して、効率的、正確、高速な検索機能を実現できると信じています。

以上がJava API開発における全文検索処理にApache Luceneを使用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート