Apache Luceneでの作業と簡単なファジー検索の作成に関する資料

この記事は、Apache Luceneテクノロジーに不慣れなユーザー向けに、初心者向けに設計されています。 Apache Luceneの内部構造、フレームワークの作成に使用されたアルゴリズム、データ構造、およびメソッドに関する資料はありません。 投稿は、単純なあいまいテキスト検索を整理する方法を示すために書かれたティーザートレーニング資料です。


githubのコード、ドキュメントとしての投稿自体、および検索クエリをテストするためのいくつかのデータは、トレーニングの資料として提供されています。



はじめに



Apache Luceneライブラリーの詳細は、 ここここに記述さています 。 この記事は、クエリ、インデックス作成、アナライザー、あいまい一致、トークン、ドキュメントなどの用語を満たします。 最初にこの記事を読むことをお勧めします。 その中で、これらの用語は、Apache Luceneライブラリに基づいたElasticsearchフレームワークのコンテキストで説明されています。 したがって、基本的な用語と定義は同じです。



ツールキット



この記事では、Apache Lucene 5.4.1の使用について説明します。 ソースコードはgithubで入手でき、リポジトリにはテスト用の小さなデータセットがあります。 基本的に、この記事はリポジトリ内のコードの詳細なドキュメントです。 BasicSearchExamplesTestクラスでテストを実行することにより、プロジェクトの「再生」を開始できます。



インデックスを作成する



MessageIndexerクラスを使用してドキュメントのインデックスを作成できます。 インデックスメソッドがあります



public void index(final Boolean create, List<Document> documents) throws IOException { final Analyzer analyzer = new RussianAnalyzer(); index(create, documents, analyzer); }
      
      







入力としてcreateおよびdocuments変数を受け入れます。 create変数は、インデクサーの動作を担当します。 trueの場合、インデックスがすでに存在していても、インデクサーは新しいインデックスを作成します。 falseの場合、インデックスが更新されます。

documents変数は、Documentオブジェクトのリストです。 ドキュメントはインデックスおよび検索オブジェクトです。 これはフィールドのセットであり、各フィールドには名前とテキスト値があります。 ドキュメントのリストを取得するために、 MessageToDocumentクラスが作成されます。 そのタスクは、bodyとtitleという2つの文字列フィールドを使用してDocumentを作成することです。



  public static Document createWith(final String titleStr, final String bodyStr) { final Document document = new Document(); final FieldType textIndexedType = new FieldType(); textIndexedType.setStored(true); textIndexedType.setIndexOptions(IndexOptions.DOCS); textIndexedType.setTokenized(true); //index title Field title = new Field("title", titleStr, textIndexedType); //index body Field body = new Field("body", bodyStr, textIndexedType); document.add(title); document.add(body); return document; }
      
      







インデックスメソッドのデフォルトはlucene -analyzers-commonライブラリで利用可能なRussianAnalyzerになっています。



インデックスの作成を試すには、 MessageIndexerTestクラスに移動します



検索する



基本的な検索機能を示すために、 BasicSearchExamplesクラスが作成れました 。 単純なトークン検索とファジー検索の2つの検索方法を実装しています。 searchIndexWithTermQuery()およびsearchInBody()メソッドは単純な検索を担当し、 fuzzySearch()メソッドはファジー検索を担当します。



Luceneでクエリを作成する方法は多数ありますが、簡単にするために、通常の検索メソッドはQueryParserクラスとTermQueryクラスを使用してのみ実装されます。 ファジー検索メソッドはFuzzyQueryを使用します。これは、1つの重要なパラメーターmaxEditsに依存します。 このパラメーターはファジー検索を担当します 。詳細はこちら 。 大まかに言えば、それが大きいほど、検索はあいまい/あいまいになります。 ここでさまざまな方法でリクエストをしてください



検索を行うには、 BasicSearchExamplesTestクラスに移動します



タスク



このプロジェクトを退屈させないために、いくつかのタスクを完了してみてください。







おわりに



Apache Luceneの利点は、そのシンプルさ、高速性、低リソース要件です。 欠点は、特にロシア語での優れたドキュメントの欠如です。 このプロジェクトは非常に迅速に開発されているため、インターネットが詰まっている書籍、チュートリアル、およびQ / Aの関連性は長く失われています。 たとえば、LuceneインデックスからTF-IDFベクトルモデルを取得する方法を理解するのに4〜5日かかりました。 この投稿が情報不足というこの問題に専門家の注意を引くことを願っています。



Apache Luceneの世界に飛び込みたい人のために、Elasticsearchのドキュメントをご覧になることをお勧めします。 信頼できるソースへのリンクと例とともに、そこにある多くのものが非常によく説明されています。



オフトップ



これは私の最初の多かれ少なかれ深刻な投稿です。 したがって、批判、フィードバック、提案を表明してください。 現在、Apache Luceneと密接に協力しているため、さらにいくつかの記事を書くことができます。



All Articles