Lucene.net是.net环境中比较强的全文检索工具,它是从JAVA中转过来的,.net版本的lucene在功能上也豪不逊色于java版的lucene。今天主要来说一下lucene索引文件在更新时的一些方式。
Lucene.net是.net环境中比较强的全文检索东西,它是从JAVA中转过来的,.net版别的Lucene在功能上也豪不差劲于java版的lucene。今日首要来说一下lucene索引文件在更新时的一些办法。
一、整个索引文件 (cfs文件)掩盖更新;长处:简略,缺陷:与服务器没有交互,但在生成索引文件时对IO影响比较大,前台lucene信息显现与数据库不同步。
二、索引文件按需求更新(对document记载进行curd操作),长处:与数据库同步,缺陷:与服务器交互多,关于curd的安全性要注重起来,但这样做是有必要的。
下面首要说一下第二种索引文件按需求更新的状况:
追加document(记载):当数据库表中有insert操作时,这时lucene也应该进行相应的insert操作,这便是追加,在IndexWriter中有AddDocument办法,它没什么好说的,按着办法签名转值即可,留意操作完结后要对IndexWriter进行Optimize和Close
- [WebMethod]
- publicintAppendLuceneDocument(stringprimaryKey,stringid,stringname,stringinfo,stringcategoryName,stringpropertyName,stringmodule,stringpassKey)
- {
- intflag=0;
- try
- {
- dirInfo=Directory.CreateDirectory(this.GetIndexPath(ConfigurationManager.AppSettings[module]));
- directory=LuceneIO.FSDirectory.Open(dirInfo);
- IndexWriterwriter=newIndexWriter(directory,newStandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29),false,IndexWriter.MaxFieldLength.UNLIMITED);
- Documentdoc=newDocument();
- doc.Add(newField("PrimaryKey",primaryKey,Field.Store.YES,Field.Index.ANALYZED));
- doc.Add(newField("ID",id,Field.Store.YES,Field.Index.NO));
- doc.Add(newField("Name",name,Field.Store.YES,Field.Index.ANALYZED));
- doc.Add(newField("Info",info,Field.Store.YES,Field.Index.ANALYZED));
- doc.Add(newField("CategoryName",categoryName,Field.Store.YES,Field.Index.ANALYZED));
- doc.Add(newField("PropertyName",propertyName,Field.Store.YES,Field.Index.ANALYZED));
- writer.AddDocument(doc);
- writer.Optimize();
- writer.Close();
- flag=1;
- }
- catch(Exception)
- {
- throw;
- }
- returnflag;
- }
删去记载(document):这个操作需求咱们留意几点:
1、要删去的记载的根据应该具有唯一性,这样删去才有含义,而且这个字段在lucene存储时需求是ANALYZED,即可以被检索到
2、删去时的条件***运用Query,而不要运用Term,我做过许多测验,成果证明Term条件总是不要使。
关于删去的代码如下:
- [WebMethod]
- publicintDeleteLuceneDocument(stringprimaryKey,stringmodule,stringpassKey)
- {
- intflag=0;
- try
- {
- dirInfo=Directory.CreateDirectory(this.GetIndexPath(ConfigurationManager.AppSettings[module]));
- directory=LuceneIO.FSDirectory.Open(dirInfo);
- IndexWriterwriter=newIndexWriter(directory,standardAnalyzer,false,IndexWriter.MaxFieldLength.UNLIMITED);
- QueryParserparser=newQueryParser(Lucene.Net.Util.Version.LUCENE_29,"PrimaryKey",newStandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29));
- Queryquery=parser.Parse(primaryKey);
- writer.DeleteDocuments(query);
- writer.Commit();
- writer.Optimize();
- writer.Close();
- flag=1;
- }
- catch(Exception)
- {
- throw;
- }
- returnflag;
- }
而更新操作事实上便是先把记载删去,再追加一条新的记载即可,而IndexWriter为咱们供给的UpdateDocuments感觉更向是在仿制一个,所以不主张运用它,
而是手动删去和追加来完结这个update操作。
- [WebMethod]
- publicintUpdateLuceneDocument(stringprimaryKey,stringid,stringname,stringinfo,stringcategoryName,stringpropertyName,stringmodule,stringpassKey)
- {
- intflag=0;
- try
- {
- dirInfo=Directory.CreateDirectory(this.GetIndexPath(ConfigurationManager.AppSettings[module]));
- directory=LuceneIO.FSDirectory.Open(dirInfo);
- IndexWriterwriter=newIndexWriter(directory,newStandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29),false,IndexWriter.MaxFieldLength.UNLIMITED);
- Documentdoc=newDocument();
- doc.Add(newField("PrimaryKey",primaryKey,Field.Store.YES,Field.Index.ANALYZED));
- doc.Add(newField("ID",id,Field.Store.YES,Field.Index.NO));
- doc.Add(newField("Name",name,Field.Store.YES,Field.Index.ANALYZED));
- doc.Add(newField("Info",info,Field.Store.YES,Field.Index.ANALYZED));
- doc.Add(newField("CategoryName",categoryName,Field.Store.YES,Field.Index.ANALYZED));
- doc.Add(newField("PropertyName",propertyName,Field.Store.YES,Field.Index.ANALYZED));
- QueryParserparser=newQueryParser(Lucene.Net.Util.Version.LUCENE_29,"PrimaryKey",newStandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29));
- Queryquery=parser.Parse(primaryKey);
- writer.DeleteDocuments(query);
- writer.Commit();
- writer.AddDocument(doc);
- writer.Optimize();
- writer.Close();
- flag=1;
- }
- catch(Exception)
- {
- throw;
- }
- returnflag;
- }
OK,这便是对索引文件进行按需的操作,今后我会把我的lucene架构收拾成文章,供我们评论。
原文链接:http://www.cnblogs.com/lori/archive/2012/08/24/2654275.html
知优网 » Lucene中对document的CURD操作:为分布式全文检索规划