Lucene整理--インデックスの管理


luceneのホームページを見て(http://lucene.apache.org/)の上で現在luceneはすでに4.9.0バージョンになって、参考学習の本は2.1バージョンによって説明して、書いたコードの例は3.0.2バージョンのを使って、バージョン
の違いはいくつかの方法の使用の違いを招きますが、大体同じです.
ソースコード用jarパッケージ(バージョン3.0.2)ダウンロードアドレス
参考資料:
1、社内研修資料
2、『Lucene検索エンジン開発権威経典』于天恩著.
Luceneは使いやすくて、辛抱強く見ても覚えられます.ソースコードもあります.
昨日は簡単なインデックスが作成され、今日はインデックスの表示、インデックスの更新、インデックスの削除方法をまとめました.
一、索引の情報を表示する
インデックスを表示するには、次の3つの方法があります.
1.IndexWriterクラスを使用して索引の関連情報を読み取る
IndexWriterクラスを使用すると、インデックスに関するいくつかの情報が得られます.
インデックスのディレクトリ情報の取得:IndexWriter.getDirectory().toString();
インデックスを取得するアナライザ:IndexWriter.getAnalyzer().toString();
つまりIndexWriterの関連メソッドでインデックスの関連情報を取得し、具体的にはAPIドキュメントを参照することができます.
2.IndexReaderおよびそのサブクラスを使用してインデックスに関する情報を取得する
注:例ではインデックスは作成されていません.使用するインデックスは前述のとおりです.
(1)、IndexReaderクラスでインデックスの基本情報を取得する
import java.io.File;
import java.io.IOException;
import java.util.Date;

import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;


public class LuceneIndexReaderTest1 {
	public static void main(String[] args) {
		File indexDir = new File("E:\\Index");
		try {
			Directory dir = new SimpleFSDirectory(indexDir);
			IndexReader ir= IndexReader.open(dir);
			
			//indexExists()            
			if(ir.indexExists(dir)){
				System.out.println("     !!");
			}else{
				System.out.println("      !!");
			}
			
			//lastModified()                     (    )
			Date d=new Date(ir.lastModified(dir));
			System.out.println(d);
						
			//isOptimized()           
			System.out.println(ir.isOptimized());
			
			//directory()        
			System.out.println(ir.directory());
			
			//numDocs()        
			System.out.println(ir.numDocs());
			
			// maxDoc()            ID
			System.out.println(ir.maxDoc());
			
			//close()  
			ir.close();
		} catch (CorruptIndexException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

(2)、索引ドキュメントに関する基本情報を読み取り、ドキュメント内のフィールドを読み取る
import java.io.File;
import java.io.IOException;
import java.util.Date;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;


public class LuceneIndexReaderTest2 {
	public static void main(String[] args) {
		File indexDir = new File("E:\\Index");
		try {
			Directory dir = new SimpleFSDirectory(indexDir);
			IndexReader ir= IndexReader.open(dir);
			int num=ir.numDocs();
			System.out.println(num);
			System.out.println("--------------------------------");
			
			//Document    
			Document doc=ir.document(5);//5  document   ID   
			System.out.println(doc);
			System.out.println("--------------------------------");
			
			for(int i=0 ; i<num; i++){
				doc=ir.document(i);
				Field field=doc.getField("bookname");//    doc  field
				System.out.println(field.stringValue());//      
				System.out.println("--------------------------------");
			}

		} catch (CorruptIndexException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

二、索引の中の文書を削除する
ドキュメント内のインデックスを取得する必要がない場合は、インデックスからドキュメントを削除する必要があります.LuceneでIndexReaderとindexModifierの2つのクラスを使用してインデックスからドキュメントを削除します.
1、IndexReaderで削除する
IndexReaderドキュメントを削除するには、ドキュメントのシーケンス番号に従って削除する必要があります.
import java.io.File;
import java.io.IOException;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;


public class deleteIndex1 {
	public static void main(String[] args) {
		File indexDir = new File("E:\\Index");
		try {
			Directory dir = new SimpleFSDirectory(indexDir);
			IndexReader ir= IndexReader.open(dir,false);//            ,   true
			ir.deleteDocument(8);
			System.out.println(ir.numDeletedDocs()); //        
			ir.close();//      ,      
		} catch (CorruptIndexException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
このとき、ドキュメントは本当に削除されず、削除されたタグを付けただけで検索に参加できなくなり、undeleteAll()メソッドを呼び出すことで削除されたドキュメントをすべて復元することができます.
IndexWriterのoptimize()メソッドを使用すると、削除マークを付けたインデックスを物理的に削除できますが、例を挙げません.
IndexReader.deleteDocuments(new Term(「bookname」、「女」)を使用すると、例を挙げずに語句に従ってインデックスを一括削除できます.
三、索引の中の文書を更新する
削除してから追加しただけです
四、索引の同期
1、lucene同時アクセス規則:
luceneはweb環境に設計されており、構築された検索エンジンは1つのスレッドだけでアクセスされないため、同時アクセスの問題を考慮する必要があります.同時アクセスの問題は処理がうまくいかないとインデックスファイルの破損を招く可能性があります.
同様の問題については、次のルールに注意する必要があります.
1)、任意の数の読み取り専用操作を同時に行うことができる
2)、ある時点で、インデックスを変更する操作は1つだけ許可されます.つまり、同じ時間に1つのインデックスが1つのIndexWriterオブジェクトまたはIndexReaderオブジェクトによってのみ開かれます.
3)、読み取り専用操作は、インデックスが変更された場合でも、同時読み取り専用でもよい.
2、インデックスロック機構
インデックス同期の問題を処理するために、Luceneにはロックメカニズムが内蔵されています.ロックは、ファイルとして表示されます.
ロックにはwrite.lockとcommit.lockの2種類があります.
write.lockは、プロセスがインデックスを同時に変更することを阻止するために使用されます.IndexWriterとIndexReaderの2つのクラスについて、インデックスの追加、変更、削除操作を行うとwrite.lockファイルが生成されます.このとき
インデックスを変更することはできません.close()が呼び出されるまで待たなければなりません.この2つのクラスがclose()を呼び出すと、ロープファイルwrite.lockも消えます.
インデックスブロックの読み込みとマージにはcommit.lockロックが使用されます.これは事物ロックです.たとえば、インデックスを最適化するときは、すべてのインデックスブロックをマージし、マージに成功したときに分散したインデックスブロックをマージする必要があります.
削除すると、プロシージャ全体に問題が発生すると、インデックスの最適化に失敗するため、物事ロックが使用されます.
どちらのロックも操作インデックスLuceneによって自動的に作成され、手動で作成および変更する必要はありません.