luceneがインデックスを作る過程
15150 ワード
2014-06-30 17:56:52 CSDN http://blog.csdn.net/caohaicheng/article/details/35992149
luceneのホームページを見ますhttp://lucene.apache.org/)現在、luceneは4.9.0バージョンになりました.勉強の本を参考にして2.1バージョンで説明しました.書いたコードの例は3.02バージョンで、バージョンはいくつかの方法の違いがありますが、大体同じです.
ソースコードに使用されるjarパッケージ(3.02バージョン)のダウンロードアドレス
参考資料:
1、社内研修資料
2、『Lucene検索エンジン開発権威経典』は天恩著である.
Luceneは使用がとても簡単で、根気よく読んで全部習得できます.ソースコードもあります.
一、索引を作成するための基本的な方法
すべてのオープンソース検索エンジンの基本的なアーキテクチャと原理は似ています.Luceneも例外ではなく、検索エンジンを構築するのも解決すべき四つの基本的な問題です.データをキャプチャし、解析データを作成し、インデックスを作成し、検索を実行します.
1、インデックス作成の過程を理解する
参考書にはインデックスの作成に対してイメージ的な比喩があります.
索引を作成するプロセスは、文集を作成するために類比できます.文集の文章を例にとって解説します.文集には多くの文章があります.各文章にはタイトル、内容、作品名、執筆時間などの情報が含まれています.
私たちはこの文集を次のように書きます.まず文章を書いて、それから文章を統合します.
まず、文章ごとにタイトル、内容、時間などの情報を加えて、文章を書きます.
そして、文章を本に加えて、文集を書きました.
文集の構成は下の図のようになっています.左から右に向かって文集を読んだり、本を開いたりして、中の文章を読んだりします.右から左に行く方向に文集を書きます.
索引を作成するプロセスは以下の通りです.
(1)インデックスを作成するIndexWriterは、本の枠組みに相当します.
(2)ドキュメントオブジェクトを作成するDockmentは、記事に相当します.
(3)情報フィールドオブジェクトFieldを作成することは、文章中の異なる情報(タイトル、本文など)に相当します.
(4)FieldをDcumentに追加します.
(5)、DockmentをIndexWriterに追加します.
(6)、インデクスIndexWriterをオフにします.
図のように索引の構成で、左から右に読む索引(検索)を示します.右から左へを押すと索引を作成します.
上の図に示すような構成で、インデックス作成には基本的な3つのステップがあります.
(1)、Fieldを作成し、文章の異なる情報を包装する
(2)複数のFieldを一つのDcumentに組織し、一つの文章に対する包装を完成させました.
(3)複数のDockmentを一つのIndexWriterに組織し、つまり複数の文章を組み立てることでインデックスを形成する
以下の3つのセクションでは、インデックス作成の基本的な手順に従ってインデックス作成の具体的な方法を説明します.
2、Fieldを作成する
Fieldを作成する方法はたくさんあります.以下は最も一般的な方法です.
Field field=new Field(Field名称、Field内容、保存方式、索引方式)
この4つのパラメータの意味は以下の通りです.
(1)、Field名はFieldからの名前で、データテーブルのフィールド名に似ています.
(2)、Fieldの内容はこのFieldの内容であり、データベーステーブルのフィールド内容と類似している.
(3)、記憶方式は3つの種類があります.保存しない(Field.Store.NO)、完全記憶(Field.Store.YES)、圧縮保存(Field.Store.OMPRESS).
通常、インデックスが大きすぎることを心配しないなら、完全に保存する方法を使用することができます.しかし、性能を考慮すると、インデックスファイルの内容は小さいほど良いです.そのため、Fieldの内容が少ない場合は、完全に保存されます.
タイトル)Fieldの内容が多い場合は、本文のように保存しないか、圧縮しない方法を採用します.
(4)、索引の方式は、4つの種類を含む.
インデックス(Field.Index.NO)、インデックスは分析しないが(Field.Index.NOKRMS)、インデックスは分類しないが単語(Field.Index.UN TOKENIZED)、分詞と索引(Field.Index.TOKENIZED).
3、Dcumentを作成する
Dcumentを作成する方法は以下の通りです.
Dcument doc=new Dcument();
この方法はFieldを含まない空Dockmentを作成するために使用されます.
FieldをDcumentに追加するには、add方法だけが必要です.例えば、doc.add(field);
繰り返し使うと複数のFieldを一つのDcumentに入れることができます.
4、IndexWriterを作成する
IndexWriterを作成する方法も少なくないです.一般的なものを取り出します.
<span style="font-family:SimSun;font-size:12px;"><span style="font-family:SimSun;font-size:12px;"> File indexDir = new File("E:\\Index"); Directory dir = new SimpleFSDirectory(indexDir); Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30); IndexWriter indexWriter = new IndexWriter(dir, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);</span></span>
いくつかのパラメータについて紹介します. (1)、ディレクトリー(カタログタイプ)このクラスは抽象類です.
その直接的なサブクラスはバージョンによって違いがあります.3.02バージョンを直言します.そのサブクラスは、FileSwitch Directory、CompundFileReader、二つのサブクラスは異なる2種類のカタログタイプを表しています.
FDirectory:ファイルシステムの一つのパスは、直接にインデックスをディスクに書き込みます.
RAM Directory:メモリの一つのエリアは、仮想マシンが終了すると内容が消えてしまうので、RAM Directoryの内容をFDirectoryに転送する必要があります.
FileSwitch Directory:一つは、二つの異なるディレクトリでファイルを同時に読み込むためのFileSwitch Directoryであり、これはエージェントクラスである.
CompundFileReader:ユーザが複合ファイルを読み込むCompundFileReaderであり、拡張子のcfsというファイルしか読み込めません.(拡張子をcfsと書くファイル用CompundFileWriter)CompundFileReaderはSegment Readerのみで参照されます.
このうちFDirectoryは3つに分類されます.
A、ウィンドウズのSimpleFS Directory
B、linuxはNIOのNIOFS Directoryをサポートします.
C、もう一つはメモリMapディレクトリMMappDirectoryです.
(2)、Analyzer(分析器)抽象類
いろいろな入力のデータソースの分析を担当しています.フィルタや分詞などの様々な機能があります.
アナライザは英語のアナライザや中国語のアナライザなどを含めて品詞分析を行うために使われます.作成する索引のファイルの状況に応じて、適切なアナライザを選択します.よく使われるのはStanddardAnalyzer、CJKAnalyzerです.
などがあります.
自分の必要に応じてアナライザを編集して、異なる言語の文字を処理してもいいです.
IndexWriterが作成した後、addDockment()の方法でdocumentオブジェクトをIndexWriterに置くことができます.
複数置いてもいいです.
最終的にclose()メソッドを呼び出してインデックスを閉じます.例えば、writer.close()
ここでインデックス作成の手順を紹介しました.実例を見ます.
二、簡単な索引の例を作成します.
<span style="font-family:SimSun;font-size:12px;">import java.io.File; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.store.Directory; import org.apache.lucene.store.SimpleFSDirectory; import org.apache.lucene.util.Version; public class LuceneMainProcess { public static void main(String[] args) { createLuceneIndex(); } public static void createLuceneIndex() { try { File indexDir = new File("E:\\Index"); Directory dir = new SimpleFSDirectory(indexDir); Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30); //IndexWriter Document Field , 10000 IndexWriter indexWriter = new IndexWriter(dir, analyzer, true, IndexWriter.MaxFieldLength.LIMITED); // 8 Document doc1 = new Document(); Document doc2 = new Document(); Document doc3 = new Document(); Document doc4 = new Document(); Document doc5 = new Document(); Document doc6 = new Document(); Document doc7 = new Document(); Document doc8 = new Document(); Field f1 = new Field("bookname", " ", Field.Store.YES, Field.Index.ANALYZED); Field f2 = new Field("bookname", " ", Field.Store.YES, Field.Index.ANALYZED); Field f3 = new Field("bookname", " ", Field.Store.YES, Field.Index.ANALYZED); Field f4 = new Field("bookname", " ", Field.Store.YES, Field.Index.ANALYZED); Field f5 = new Field("bookname", " ", Field.Store.YES, Field.Index.ANALYZED); Field f6 = new Field("bookname", " ", Field.Store.YES, Field.Index.ANALYZED); Field f7 = new Field("bookname", " ", Field.Store.YES, Field.Index.ANALYZED); Field f8 = new Field("bookname", " ", Field.Store.YES, Field.Index.ANALYZED); doc1.add(f1); doc2.add(f2); doc3.add(f3); doc4.add(f4); doc5.add(f5); doc6.add(f6); doc7.add(f7); doc8.add(f8); indexWriter.addDocument(doc1); indexWriter.addDocument(doc2); indexWriter.addDocument(doc3); indexWriter.addDocument(doc4); indexWriter.addDocument(doc5); indexWriter.addDocument(doc6); indexWriter.addDocument(doc7); indexWriter.addDocument(doc8); indexWriter.optimize();// , , , , ( ) indexWriter.close();// , , } catch (Exception e) { e.printStackTrace(); } } } </span>
実行後、私たちはEディスクの下にindexディレクトリが現れていることを発見しました.これは私たちが作成したインデックスファイルです. これでインデックスファイルの作成が完了しました.
明日は続けてインデックスの読み取りを整理します.その時、私たちは上記のインデックスが成功したかどうかをより直感的に判断することができます.