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