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

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

Jun 18, 2023 pm 06:11 PM
java api lucene

インターネット上のデータ量は増加の一途をたどっており、データをいかに迅速かつ正確に検索するかが重要な課題となっています。この問題に対応して、オープン ソースの全文検索エンジン ライブラリの 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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

See all articles