4.1保持資料庫與索引庫的同步
說明:在一個系統中,如果索引功能存在,那麼資料庫和索引庫應該是同時存在的。這個時候需要保證索引庫的資料和資料庫中的資料保持一緻性。可以在對資料庫進行增、删、改操作的同時對索引庫也進行相應的操作。這樣就可以保證資料庫與索引庫的一緻性。
工具類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();
}