Lucene.net是.net环境中比较强的全文检索工具,它是从JAVA中转过来的,.net版本的lucene在功能上也豪不逊色于java版的lucene。今天主要来说一下lucene索引文件在更新时的一些方式。

Lucene.net是.net环境中比较强的全文检索东西,它是从JAVA中转过来的,.net版别的Lucene在功能上也豪不差劲于java版的lucene。今日首要来说一下lucene索引文件在更新时的一些办法。

Lucene中对document的CURD操作:为分布式全文检索规划  Lucene 分布式 全文检索 第1张

一、整个索引文件 (cfs文件)掩盖更新;长处:简略,缺陷:与服务器没有交互,但在生成索引文件时对IO影响比较大,前台lucene信息显现与数据库不同步。

二、索引文件按需求更新(对document记载进行curd操作),长处:与数据库同步,缺陷:与服务器交互多,关于curd的安全性要注重起来,但这样做是有必要的。

下面首要说一下第二种索引文件按需求更新的状况:

追加document(记载):当数据库表中有insert操作时,这时lucene也应该进行相应的insert操作,这便是追加,在IndexWriter中有AddDocument办法,它没什么好说的,按着办法签名转值即可,留意操作完结后要对IndexWriter进行Optimize和Close

  1. [WebMethod]
  2. publicintAppendLuceneDocument(stringprimaryKey,stringid,stringname,stringinfo,stringcategoryName,stringpropertyName,stringmodule,stringpassKey)
  3. {
  4. intflag=0;
  5. try
  6. {
  7. dirInfo=Directory.CreateDirectory(this.GetIndexPath(ConfigurationManager.AppSettings[module]));
  8. directory=LuceneIO.FSDirectory.Open(dirInfo);
  9. IndexWriterwriter=newIndexWriter(directory,newStandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29),false,IndexWriter.MaxFieldLength.UNLIMITED);
  10. Documentdoc=newDocument();
  11. doc.Add(newField("PrimaryKey",primaryKey,Field.Store.YES,Field.Index.ANALYZED));
  12. doc.Add(newField("ID",id,Field.Store.YES,Field.Index.NO));
  13. doc.Add(newField("Name",name,Field.Store.YES,Field.Index.ANALYZED));
  14. doc.Add(newField("Info",info,Field.Store.YES,Field.Index.ANALYZED));
  15. doc.Add(newField("CategoryName",categoryName,Field.Store.YES,Field.Index.ANALYZED));
  16. doc.Add(newField("PropertyName",propertyName,Field.Store.YES,Field.Index.ANALYZED));
  17. writer.AddDocument(doc);
  18. writer.Optimize();
  19. writer.Close();
  20. flag=1;
  21. }
  22. catch(Exception)
  23. {
  24. throw;
  25. }
  26. returnflag;
  27. }

删去记载(document):这个操作需求咱们留意几点:

1、要删去的记载的根据应该具有唯一性,这样删去才有含义,而且这个字段在lucene存储时需求是ANALYZED,即可以被检索到

2、删去时的条件***运用Query,而不要运用Term,我做过许多测验,成果证明Term条件总是不要使。

关于删去的代码如下:

  1. [WebMethod]
  2. publicintDeleteLuceneDocument(stringprimaryKey,stringmodule,stringpassKey)
  3. {
  4. intflag=0;
  5. try
  6. {
  7. dirInfo=Directory.CreateDirectory(this.GetIndexPath(ConfigurationManager.AppSettings[module]));
  8. directory=LuceneIO.FSDirectory.Open(dirInfo);
  9. IndexWriterwriter=newIndexWriter(directory,standardAnalyzer,false,IndexWriter.MaxFieldLength.UNLIMITED);
  10. QueryParserparser=newQueryParser(Lucene.Net.Util.Version.LUCENE_29,"PrimaryKey",newStandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29));
  11. Queryquery=parser.Parse(primaryKey);
  12. writer.DeleteDocuments(query);
  13. writer.Commit();
  14. writer.Optimize();
  15. writer.Close();
  16. flag=1;
  17. }
  18. catch(Exception)
  19. {
  20. throw;
  21. }
  22. returnflag;
  23. }

而更新操作事实上便是先把记载删去,再追加一条新的记载即可,而IndexWriter为咱们供给的UpdateDocuments感觉更向是在仿制一个,所以不主张运用它,

而是手动删去和追加来完结这个update操作。

  1. [WebMethod]
  2. publicintUpdateLuceneDocument(stringprimaryKey,stringid,stringname,stringinfo,stringcategoryName,stringpropertyName,stringmodule,stringpassKey)
  3. {
  4. intflag=0;
  5. try
  6. {
  7. dirInfo=Directory.CreateDirectory(this.GetIndexPath(ConfigurationManager.AppSettings[module]));
  8. directory=LuceneIO.FSDirectory.Open(dirInfo);
  9. IndexWriterwriter=newIndexWriter(directory,newStandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29),false,IndexWriter.MaxFieldLength.UNLIMITED);
  10. Documentdoc=newDocument();
  11. doc.Add(newField("PrimaryKey",primaryKey,Field.Store.YES,Field.Index.ANALYZED));
  12. doc.Add(newField("ID",id,Field.Store.YES,Field.Index.NO));
  13. doc.Add(newField("Name",name,Field.Store.YES,Field.Index.ANALYZED));
  14. doc.Add(newField("Info",info,Field.Store.YES,Field.Index.ANALYZED));
  15. doc.Add(newField("CategoryName",categoryName,Field.Store.YES,Field.Index.ANALYZED));
  16. doc.Add(newField("PropertyName",propertyName,Field.Store.YES,Field.Index.ANALYZED));
  17. QueryParserparser=newQueryParser(Lucene.Net.Util.Version.LUCENE_29,"PrimaryKey",newStandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29));
  18. Queryquery=parser.Parse(primaryKey);
  19. writer.DeleteDocuments(query);
  20. writer.Commit();
  21. writer.AddDocument(doc);
  22. writer.Optimize();
  23. writer.Close();
  24. flag=1;
  25. }
  26. catch(Exception)
  27. {
  28. throw;
  29. }
  30. returnflag;
  31. }

OK,这便是对索引文件进行按需的操作,今后我会把我的lucene架构收拾成文章,供我们评论。

原文链接:http://www.cnblogs.com/lori/archive/2012/08/24/2654275.html

转载请说明出处
知优网 » Lucene中对document的CURD操作:为分布式全文检索规划

发表评论

您需要后才能发表评论