Lucene中对document(记录)的CURD操作~为分布式全文检索设计

摘要:
Lucene.net是.net环境中比较强的全文检索工具,它是从JAVA中转过来的,.net版本的lucene在功能上也豪不逊色于java版的lucene。今天主要来说一下lucene索引文件在更新时的一些方式。二 索引文件按需要更新,优点:与数据库同步,缺点:与服务器交互多,对于curd的安全性要重视起来,但这样做是必须的。

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

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

二 索引文件按需要更新(对document记录进行curd操作),优点:与数据库同步,缺点:与服务器交互多,对于curd的安全性要重视起来,但这样做是必须的。

下面主要说一下第二种索引文件按需要更新的情况

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

1 [WebMethod]
2         public int AppendLuceneDocument(string primaryKey, string id, string name, string info, string categoryName, string propertyName, string module, stringpassKey)
3 {
4             int flag = 0;
5             try
6 {
7                 dirInfo = Directory.CreateDirectory(this.GetIndexPath(ConfigurationManager.AppSettings[module]));
8                 directory =LuceneIO.FSDirectory.Open(dirInfo);
9                 IndexWriter writer = new IndexWriter(directory, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), false, IndexWriter.MaxFieldLength.UNLIMITED);
10                 Document doc = newDocument();
11                 doc.Add(new Field("PrimaryKey", primaryKey, Field.Store.YES, Field.Index.ANALYZED));
12                 doc.Add(new Field("ID", id, Field.Store.YES, Field.Index.NO));
13                 doc.Add(new Field("Name", name, Field.Store.YES, Field.Index.ANALYZED));
14                 doc.Add(new Field("Info", info, Field.Store.YES, Field.Index.ANALYZED));
15                 doc.Add(new Field("CategoryName", categoryName, Field.Store.YES, Field.Index.ANALYZED));
16                 doc.Add(new Field("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 
25                 throw;
26 }
27             returnflag;
28         }

删除记录(document):这个操作需要我们注意几点:

1 要删除的记录的依据应该具有唯一性,这样删除才有意义,并且这个字段在lucene存储时需要是ANALYZED,即可以被检索到

2 删除时的条件最好使用Query,而不要使用Term,我做过很多测试,结果证明Term条件总是不要使。

对于删除的代码如下:

1 [WebMethod]
2         public int DeleteLuceneDocument(string primaryKey, string module, stringpassKey)
3 {
4             int flag = 0;
5             try
6 {
7                 dirInfo = Directory.CreateDirectory(this.GetIndexPath(ConfigurationManager.AppSettings[module]));
8                 directory =LuceneIO.FSDirectory.Open(dirInfo);
9                 IndexWriter writer = new IndexWriter(directory, standardAnalyzer, false, IndexWriter.MaxFieldLength.UNLIMITED);
10                 QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "PrimaryKey", newStandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29));
11                 Query query =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 
21                 throw;
22 }
23             returnflag;
24         }

而更新操作事实上就是先把记录删除,再追加一条新的记录即可,而IndexWriter为我们提供的UpdateDocuments感觉更向是在复制一个,所以不建议使用它,

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

1 [WebMethod]
2         public int UpdateLuceneDocument(string primaryKey, string id, string name, string info, string categoryName, string propertyName, string module, stringpassKey)
3 {
4             int flag = 0;
5             try
6 {
7                 dirInfo = Directory.CreateDirectory(this.GetIndexPath(ConfigurationManager.AppSettings[module]));
8                 directory =LuceneIO.FSDirectory.Open(dirInfo);
9                 IndexWriter writer = new IndexWriter(directory, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), false, IndexWriter.MaxFieldLength.UNLIMITED);
10                 Document doc = newDocument();
11                 doc.Add(new Field("PrimaryKey", primaryKey, Field.Store.YES, Field.Index.ANALYZED));
12                 doc.Add(new Field("ID", id, Field.Store.YES, Field.Index.NO));
13                 doc.Add(new Field("Name", name, Field.Store.YES, Field.Index.ANALYZED));
14                 doc.Add(new Field("Info", info, Field.Store.YES, Field.Index.ANALYZED));
15                 doc.Add(new Field("CategoryName", categoryName, Field.Store.YES, Field.Index.ANALYZED));
16                 doc.Add(new Field("PropertyName", propertyName, Field.Store.YES, Field.Index.ANALYZED));
17                 QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "PrimaryKey", newStandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29));
18                 Query query =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 
29                 throw;
30 }
31 
32             returnflag;
33         }

OK,这就是对索引文件进行按需的操作,以后我会把我的lucene架构整理成文章,供大家讨论。

免责声明:文章转载自《Lucene中对document(记录)的CURD操作~为分布式全文检索设计》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇(一)微服务基础Python中numpy 数组的切片操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java通过jdbc连接数据库并更新数据(包括java.util.Date类型数据的更新)

一、步骤 1.获取Date实例,并通过getTime()方法获得毫秒数; 2.将获取的毫秒数存储到数据库中,注意存储类型为nvarchar(20); 3.读取数据库的毫秒数,作为Date构造方法的参数创建实例,有需要再转换时间格式。 二、代码示例 packagecom.yh.dao; importjava.sql.Connection; importja...

wpf mvvm模式下 在ViewModel关闭view

本文只是博主用来记录笔记,误喷 使用到到了MVVM中消息通知功能 第一步:在需要关闭窗体中注册消息   1 public UserView() 2 { 3 this.DataContext = new UserViewModel(); 4 InitializeComponent();...

loadrunner之WebServices协议脚本编写(三种请求模式)

以天气预报网站为例:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl   一、web_service_call模式 步骤如下:   经过增加事务和if 判断的脚本如下: Action() { lr_start_transaction("获取天气预报"...

yii2源码学习笔记(十四)

Module类是模块和应用类的基类。  yiisoftyii2aseModule.php 1 <?php 2 /** 3 * @link http://www.yiiframework.com/ 4 * @copyright Copyright (c) 2008 Yii Software LLC 5 * @license h...

vb mid函数的使用方法详细介绍

mid函数从字符串中返回指定数量的字符。 语法 Mid(string, start[, length]) 对语法的理解就是:返回string中从start开始的后面的length长度的字符串 string是必需的参数,如果string包含Null,返回结果也将是Null。 start必需的参数,string中被取出部分的字符位置。需要注意的是如果start超...

浅淡Webservice、WSDL三种服务访问的方式(附案例)

Webservice Webservice是使应用程序以与平台和编程语言无关的方式进行相互通信技术。 eg:站点提供访问的数据接口:新浪微博、淘宝。 官方解释:它是一种构建应用程序的普遍模型,可以在任何支持网络通信的操作系统中实施运行;它是一种新的web应用程序分支,是自包含、自描述、模块化的应用,可以发布、定位、通过web调用。WebService是一个...