天天看點

Lucene-索引庫的CRUD

4.1保持資料庫與索引庫的同步

Lucene-索引庫的CRUD

說明:在一個系統中,如果索引功能存在,那麼資料庫和索引庫應該是同時存在的。這個時候需要保證索引庫的資料和資料庫中的資料保持一緻性。可以在對資料庫進行增、删、改操作的同時對索引庫也進行相應的操作。這樣就可以保證資料庫與索引庫的一緻性。

工具類DocumentUtils

public class DocumentUtils {
	public static Document article2Document(Article article){
		Document document = new Document();
		Field idField = new Field("id",article.getId().toString(),Store.YES,Index.NOT_ANALYZED);
		Field titleField = new Field("title",article.getTitle(),Store.YES,Index.ANALYZED);
		Field contentField = new Field("content",article.getContent(),Store.YES,Index.ANALYZED);
		document.add(idField);
		document.add(titleField);
		document.add(contentField);
		return document;
	}
	
	public static Article document2Article(Document document){
		Article article = new Article();
		article.setId(Long.parseLong(document.get("id")));
		article.setTitle(document.get("title"));
		article.setContent(document.get("content"));
		return article;
	}
}
           
public class LuceneUtils {
	public static Directory directory;
	public static Analyzer analyzer;
	static{
		try{
			directory = FSDirectory.open(new File("./indexDir"));
			analyzer = new StandardAnalyzer(Version.LUCENE_30);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}
           
public class ArticleIndex {
	@Test
	public void testCreateIndex() throws Exception{
		Article article = new  Article();
		article.setId(1L);
		article.setTitle("lucene可以做搜尋引擎");
		article.setContent("baidu,google都是很好的搜尋引擎");
		
		IndexWriter indexWriter = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);
		indexWriter.addDocument(DocumentUtils.article2Document(article));
		indexWriter.close();
	}
	
	@Test
	public void testSearchIndex() throws Exception{
		IndexSearcher indexSearcher = new IndexSearcher(LuceneUtils.directory);
		QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30, new String[]{"title","content"}, LuceneUtils.analyzer);
		Query query = queryParser.parse("baidu");
		TopDocs topDocs = indexSearcher.search(query, 2);
		ScoreDoc[] scoreDocs = topDocs.scoreDocs;
		List<Article> articleList = new ArrayList<Article>();
		for(ScoreDoc scoreDoc:scoreDocs){
			Document document =  indexSearcher.doc(scoreDoc.doc);
			Article article = DocumentUtils.document2Article(document);
			articleList.add(article);
		}
		
		for(Article article:articleList){
			System.out.println(article.getId());
			System.out.println(article.getTitle());
			System.out.println(article.getContent());
		}
	}
	
	/**
	 * 一般情況下索引庫的删除用關鍵詞
	 * @throws Exception
	 */
	@Test
	public void testDeleteIndex() throws Exception{
		IndexWriter indexWriter = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);
		//indexWriter.deleteAll()删除所有的索引值
		/**
		 * term就為關鍵詞對象
		 */
		Term term = new Term("title", "lucene");
		indexWriter.deleteDocuments(term);
		indexWriter.close();
	}
	
	/**
	 * 修改
	 *    先删除後增加
	 */
	@Test
	public void testUpdateIndex() throws Exception{
		IndexWriter indexWriter = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);
		Term term = new Term("title", "lucene");
		Article article = new  Article();
		article.setId(1L);
		article.setTitle("lucene可以做搜尋引擎");
		article.setContent("修改後的内容");
		/**
		 * term是用删除的
		 * document是用于增加的
		 */
		indexWriter.updateDocument(term, DocumentUtils.article2Document(article));
		indexWriter.close();
	}
}
           
public void create () throws CorruptIndexException, LockObtainFailedException, IOException{
		Article article = new  Article();
		article.setId(1L);
		article.setTitle("lucene可以做搜尋引擎");
		article.setContent("baidu,google都是很好的搜尋引擎");
		IndexWriter indexWriter=new IndexWriter(LuceneUtils.directory, LuceneUtils.analyzer, MaxFieldLength.LIMITED);
		indexWriter.addDocument(DocumentUtils.article2Document(article));
		indexWriter.close();
	}
           
@Test
	public void Query() throws CorruptIndexException, IOException,
			ParseException {
		IndexSearcher indexSearcher = new IndexSearcher(LuceneUtils.directory);
		QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30,
				new String[] { "title", "content" }, LuceneUtils.analyzer);

		TopDocs topDocs = indexSearcher.search(queryParser.parse("lucene"), 2);
		ScoreDoc[] scoreDocs = topDocs.scoreDocs;
		List<Article> articleList = new ArrayList<Article>();
		for (ScoreDoc scoreDoc : scoreDocs) {
			System.err.println("相關度為" + scoreDoc.score);
			Document document = indexSearcher.doc(scoreDoc.doc);
			Article article = DocumentUtils.document2Article(document);
			articleList.add(article);
		}
		for (Article article : articleList) {
			System.out.println(article.getId());
			System.out.println(article.getTitle());
			System.out.println(article.getContent());
		}
	}
           
@Test
	public void delete() throws CorruptIndexException, LockObtainFailedException, IOException{
		IndexWriter indexWriter=new IndexWriter(LuceneUtils.directory, LuceneUtils.analyzer, MaxFieldLength.LIMITED);
		// indexWriter.deleteAll()删除所有的索引值
				/**
				 * term就為關鍵詞對象
				 */
		indexWriter.deleteDocuments(new Term("title","lucene"));
		indexWriter.close();
		
	}
           
/**
	 * 
	 * 修改 先删除後增加
	 * @throws IOException 
	 * @throws CorruptIndexException 
	 * 
	 */
	@Test
	public void update() throws CorruptIndexException, IOException {
		IndexWriter indexWriter = new IndexWriter(LuceneUtils.directory,
				LuceneUtils.analyzer, MaxFieldLength.LIMITED);
		Term term = new Term("title", "lucene");
		Article article = new Article();
		article.setId(1L);
		article.setTitle("lucene可以做搜尋引擎");
		article.setContent("修改後的内容");
		/**
		 * term是用删除的 document是用于增加的
		 */
		indexWriter.updateDocument(term,
				DocumentUtils.article2Document(article));
		indexWriter.close();
	}
           

繼續閱讀