package com.sdudoc.lucene;

import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;



/**
 * 索引创建、删除、更新、添加
 * @author Administrator
 *
 */
public class LuceneIndex {
	private static final Object MUTEX = new Object();
	private LuceneIndexSettings indexSettings;
	private Directory ramDirectory;
	
	
	/**
	 * 构造方法
	 */
	public LuceneIndex(LuceneIndexSettings luceneIndexSettings){
		this.indexSettings = luceneIndexSettings;
	}
	
	/**
	 * 刷新内存索引
	 */
	public void flushRAMDirectory(){
		synchronized (MUTEX) {
			IndexWriterConfig indexWriterConfig = null;
			IndexWriter indexWriter = null;
			ramDirectory = new RAMDirectory();
			try{
				indexWriterConfig = new IndexWriterConfig(Version.LUCENE_44, this.indexSettings.getAnalyzer());
				indexWriter = new IndexWriter(this.indexSettings.getDirectory(), indexWriterConfig);
				indexWriter.addIndexes(new Directory[]{this.ramDirectory});
			}catch(Exception e){
				e.printStackTrace();
			}finally{
				try{
					indexWriter.close();
				}catch(Exception e){
					e.printStackTrace();
				}
				
			}
		}
	}
	
	/**
	 * 创建索引
	 * @param post
	 */
	public void createIndex(Post post){
			synchronized (MUTEX) {
				System.out.println("createIndex");
				IndexWriterConfig indexWriterConfig = null;
				IndexWriter indexWriter = null;
				try{
					indexWriterConfig = new IndexWriterConfig(Version.LUCENE_44, this.indexSettings.getAnalyzer());
					indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
					indexWriter = new IndexWriter(this.indexSettings.getDirectory(), indexWriterConfig);
					//调用创建document的方法
					 Document doc = createDocument(post);
					 System.out.println("我创建的doc:"+doc);
					 indexWriter.addDocument(doc);
				}catch(Exception e){
					e.printStackTrace();
				}finally{
					try{
						indexWriter.close();
					}catch(Exception e){
						e.printStackTrace();
					}
				}
			}
	}
	
	
	
	/**
	 * 批量创建索引
	 * @param list
	 */
	public void createIndexALL(List list){
			synchronized (MUTEX) {
				System.out.println("createIndexALL");
				IndexWriterConfig indexWriterConfig = null;
				IndexWriter indexWriter = null;
				try{
					indexWriterConfig = new IndexWriterConfig(Version.LUCENE_44, this.indexSettings.getAnalyzer());
					indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
					indexWriter = new IndexWriter(this.indexSettings.getDirectory(), indexWriterConfig);
					//调用创建document的方法
					 List docs = createDocumentAll(list);
					 System.out.println("一共有:"+docs.size());
					 for(int i=0; i<docs.size(); i++){
						 indexWriter.addDocument((Document)docs.get(i));
					 }
				}catch(Exception e){
					e.printStackTrace();
				}finally{
					try{
						indexWriter.close();
					}catch(Exception e){
						e.printStackTrace();
					}
				}
			}
	}
	
	
	/**
	 * 更新索引:先删除对应的索引,再更新。
	 * @param post
	 */
	public void updateIndex(Post post){
		if(delIndex(post)){
			createIndex(post);
		}
	}
	
	/**
	 * 更新全部索引
	 * @param list
	 */
	public void updateIndexAll(List list){
		synchronized (MUTEX) {
			System.out.println("createIndexALL");
			IndexWriterConfig indexWriterConfig = null;
			IndexWriter indexWriter = null;
			try{
				indexWriterConfig = new IndexWriterConfig(Version.LUCENE_44, this.indexSettings.getAnalyzer());
				indexWriterConfig.setOpenMode(OpenMode.CREATE);
				indexWriter = new IndexWriter(this.indexSettings.getDirectory(), indexWriterConfig);
				//调用创建document的方法
				 List docs = createDocumentAll(list);
				 System.out.println("一共有:"+docs.size());
				 for(int i=0; i<docs.size(); i++){
					 indexWriter.addDocument((Document)docs.get(i));
				 }
			}catch(Exception e){
				e.printStackTrace();
			}finally{
				try{
					indexWriter.close();
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * 删除索引
	 * @param post 实体对象
	 * @return isOK删除结果
	 */
	public boolean delIndex(Post post){
		boolean isOK = false;
		synchronized (MUTEX) {
			IndexWriter indexWriter = null;
			IndexWriterConfig indexWriterConfig = null;
			try{
				indexWriterConfig = new IndexWriterConfig(Version.LUCENE_44, this.indexSettings.getAnalyzer());
				indexWriter = new IndexWriter(this.indexSettings.getDirectory(), indexWriterConfig);
				indexWriter.deleteDocuments(new Term("bookID",post.getBookID()));
				isOK = true;
			}catch(Exception e){
				e.printStackTrace();
			}finally{
				try{
					indexWriter.close();
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}
		return isOK;
	}
	/**
	 * 批量删除索引
	 * @param list
	 * @return
	 */
	public boolean delIndexAll(List<Post> list){
		synchronized (MUTEX) {
			IndexWriterConfig indexWriterConfig = null;
			IndexWriter indexWriter = null;
			try{
				indexWriterConfig = new IndexWriterConfig(Version.LUCENE_44, this.indexSettings.getAnalyzer());
				//indexWriterConfig.setOpenMode(OpenMode.CREATE);
				indexWriter = new IndexWriter(this.indexSettings.getDirectory(), indexWriterConfig);
				 System.out.println("一共有:"+list.size());
				
				 for(int i=0; i<list.size(); i++){
					 indexWriter.deleteDocuments(new Term("bookID",list.get(i).getBookID()));
				 }
				 
			}catch(Exception e){
				e.printStackTrace();
			}finally{
				try{
					indexWriter.close();
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}
		return true;
	}
	
	
	/**
	 * 创建document对象
	 * @param post 实体类
	 * @return document document对象
	 */
	public Document createDocument(Post post){
		Document document = new Document();
		document.add(new StringField("bookID",post.getBookID(),Store.YES));
		document.add(new TextField("bookTitle",post.getBookTitle(),Store.YES));
		document.add(new TextField("summary",post.getSummary(),Store.YES));
		document.add(new StringField("bookStyle",post.getBookStyle(),Store.YES));
		document.add(new StringField("authors",post.getAuthors(),Store.YES));
		return document;
	}
	
	/**
	 * 批量创创建document
	 * @param list
	 * @return
	 */
	public List  createDocumentAll(List list){
		List documents = new ArrayList();
		for(int i=0; i<list.size(); i++){
			Post post = (Post)list.get(i);
			Document document = new Document();
			document.add(new StringField("bookID",post.getBookID(),Store.YES));
			document.add(new TextField("bookTitle",post.getBookTitle(),Store.YES));
			document.add(new TextField("summary",post.getSummary(),Store.YES));
			document.add(new StringField("bookStyle",post.getBookStyle(),Store.YES));
			document.add(new StringField("authors",post.getAuthors(),Store.YES));
			documents.add(document);
		}
		return documents;
	}
	
	/**
	 * 判断索引是否存在
	 * @param post
	 * @return
	 */
	public boolean exist(Post post){
		boolean isExits = false;
		IndexReader indexReader = null;
		try{
			indexReader = DirectoryReader.open(this.indexSettings.getDirectory());
			int count = indexReader.docFreq(new Term("bookID",post.getBookID()));
			isExits = count > 0;
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try{
				indexReader.close();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		return isExits;
	}
	
}