Java API開発における全文検索処理にApache Luceneを使用する
インターネット上のデータ量は増加の一途をたどっており、データをいかに迅速かつ正確に検索するかが重要な課題となっています。この問題に対応して、オープン ソースの全文検索エンジン ライブラリの 1 つである Apache Lucene は、Java プログラミング言語と統合されたアプリケーションに適した全文検索エンジンが登場しました。この記事では、Java API開発における全文検索処理にApache Luceneを使用する方法を紹介します。
1. Apache Lucene の概要
Apache Lucene は全文検索エンジン ライブラリであり、以下に基づいた高性能、フル機能、使いやすい検索エンジン ライブラリです。ジャワ。大量のテキスト データのインデックスを作成し、効率的で正確かつ迅速な検索結果を提供できます。 Lucene は、ディスクベースのインデックス作成テクノロジを使用して、テキスト データを複数の単語に分割し、転置インデックス テーブルに保存します。逆索引テーブルは、単語と文書の間の関係を使用して、単語を、その単語が配置されている文書を指すようにします。クエリ プロセス中に、逆索引テーブルは単語ごとにドキュメントを検索し、それらをクエリ結果として返します。
2. Lucene のコア コンポーネント
Lucene は複数のコア コンポーネントで構成されています。これらのコンポーネントは連携して、次のような高性能の全文検索エンジンを実装します。
- Analyzer
Anaylzer は、テキスト データを分割するだけでなく、複数に分割するためにも使用されます。テキストを単語に変換するだけでなく、単語アナライザーを使用してストップワードをフィルタリングしたり、大文字と小文字を変換したりすることもできます。
- IndexWriter (インデックス ライター)
IndexWriter は、テキスト データをインデックス テーブルに変換し、逆インデックス テーブルを構築し、それをディスクに保存するために使用されます。データを検索する必要がある場合、インデックステーブルからデータを素早く検索できます。
- IndexReader (インデックス リーダー)
IndexReader は、ディスクからインデックス テーブルを読み取り、メモリにロードするために使用されます。データはメモリからロードされるため、データのクエリは非常に高速です。
- Query (クエリ)
Query は、ユーザーが入力した文字列を検索条件に変換し、Lucene インデックス テーブル内のデータを迅速に検索するために使用されます。
3. Lucene を使用して全文検索を実装する
- Lucene 依存関係の紹介
Maven は、Java 開発で一般的に使用される依存関係管理ツールです。 Maven に次の Lucene 依存関係を追加するだけです。
<dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>8.8.2</version> </dependency>
- インデックスの作成
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
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 を閉じるために使用されます。
以上がJava API開発における全文検索処理にApache Luceneを使用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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