【转载】使用Lucene.NET实现数据检索功能
1、索引的管理
//指定索引库文件存放文件位置
FSDirectory directory = FSDirectory.Open(new DirectoryInfo(this.IndexDataDir), new NativeFSLockFactory());
//判断索引文件目录是否存在
bool isExist = IndexReader.IndexExists(directory);
if (isExist)
{
if (IndexWriter.IsLocked(directory))
{
IndexWriter.Unlock(directory);
}
}
//盘古分词器
PanGuAnalyzer analyzer = new PanGuAnalyzer();
//索引写入类
IndexWriter writer = new IndexWriter(directory, analyzer, !isExist, IndexWriter.MaxFieldLength.UNLIMITED);
//循环队列执行操作
while (IndexDataQueue.Count > )
{
Document document = new Document();
//这是我为索引数据自定义的模型类,主要内容是文件的路径、名称、内容和索引管理的操作类型(新增、更新、删除)
BaseDataMode mode = IndexDataQueue.Dequeue();
switch (mode.Type)
{
case OperationType.Insert:
{
foreach (KeyValuePair<string, string> kv in mode.Content)
{
//这里kv.Key是设置索引内字段的名称,kv.Value是这个字段内存储的内容。
document.Add(new Field(kv.Key, kv.Value, Field.Store.YES, Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
}
writer.AddDocument(document);
}; break;
case OperationType.Update:
{
//设置删除条件
MultiFieldQueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_29, new string[] { "id" }, analyzer);
Query query = parser.Parse(mode.Content["id"]);
writer.DeleteDocuments(query);
foreach (KeyValuePair<string, string> kv in mode.Content)
{
document.Add(new Field(kv.Key, kv.Value, Field.Store.YES, Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
}
writer.AddDocument(document);
}; break;
case OperationType.Delete:
{
MultiFieldQueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_29, new string[] { "id" }, analyzer);
Query query = parser.Parse(mode.Content["id"]);
writer.DeleteDocuments(query);
}; break;
default: { }; break;
}
}
//提交操作
writer.Commit();
//优化
writer.Optimize();
//关闭连接
writer.Close();
directory.Close();
2、检索
//指定索引库文件存放文件位置
FSDirectory directory = FSDirectory.Open(new DirectoryInfo(this.IndexDir), new NativeFSLockFactory());
IndexReader reader = IndexReader.Open(directory, true);
IndexSearcher searcher = new IndexSearcher(reader);
//设置关键词在条件中为OR关系
BooleanQuery queryOr = new BooleanQuery();
foreach (string word in SplitContent.SplitByPanGu(keyword))
{
foreach (KeyValuePair<string, string> kv in Mode.Content)
{
TermQuery query = new TermQuery(new Term(kv.Key, word));
//这里设置条件为Or关系
queryOr.Add(query, BooleanClause.Occur.SHOULD);
}
}
//获取搜索结果
//1000为搜索文件的下标限制,设置这个可以控制检索的范围,也可以用于分页显示
TopDocs tds = searcher.Search(queryOr, null, );
ScoreDoc[] docs = tds.scoreDocs;
for (int i = ; i < docs.Length; i++)
{
int docId = docs[i].doc;
Document doc = searcher.Doc(docId);
string content = doc.Get("索引内字段的名称");
}
转自:http://www.cnblogs.com/liusuqi/p/3671161.html
【转载】使用Lucene.NET实现数据检索功能的更多相关文章
- 使用Lucene.NET实现数据检索功能
		
引言 在软件系统中查询数据是再平常不过的事情了,那当数据量非常大,数据存储的媒介不是数据库,或者检索方式要求更为灵活的时候,我们该如何实现数据的检索呢?为数据建立索引吧,利用索引技术可以更灵活 ...
 - Lucene最重要的功能是对一段话的分析
		
Lucene最重要的功能是对一段话的分析
 - 【转载】Lucene.Net入门教程及示例
		
本人看到这篇非常不错的Lucene.Net入门基础教程,就转载分享一下给大家来学习,希望大家在工作实践中可以用到. 一.简单的例子 //索引Private void Index(){ Index ...
 - BuguMongo是一个MongoDB Java开发框架,集成了DAO、Query、Lucene、GridFS等功能
		
http://code.google.com/p/bugumongo/ 简介 BuguMongo是一个MongoDB Java开发框架,它的主要功能包括: 基于注解的对象-文档映射(Object-Do ...
 - [转载] Apache Lucene初探
		
转载自http://www.cnblogs.com/xing901022/p/3933675.html 讲解之前,先来分享一些资料 首先呢,学习任何一门新的亦或是旧的开源技术,百度其中一二是最简单的办 ...
 - 如何使用 Lucene 做网站高亮搜索功能?
		
现在基本上所有网站都支持搜索功能,现在搜索的工具有很多,比如Solr.Elasticsearch,它们都是基于 Lucene 实现的,各有各的使用场景.Lucene 比较灵活,中小型项目中使用的比较多 ...
 - 【转载】使用宝塔Linux面板功能查看服务器CPU使用率
		
运维过阿里云服务器或者腾讯云服务器的运维人员都知道,针对耗资源以及高并发的应用,很多时候我们需要关注云服务器的资源利用率情况,如最近一段时间内CPU的使用率.内存占用率等情况信息.阿里云和腾讯云官方后 ...
 - 【转载】 使用宝塔Linux面板功能查看服务器内存使用情况
		
运维过阿里云服务器或者腾讯云服务器的运维人员都知道,针对占用内存比较高的应用或者服务等,我们需要时刻关注服务器的内存使用率,是否存在内存瓶颈等情况的出现.阿里云和腾讯云官方后台界面的监控数据页面也有相 ...
 - 转载:jQuery实现返回顶部功能
		
转自:http://blog.csdn.net/itmyhome1990/article/details/25340705 整理两个实现功能,一个是右下角的返回顶部,一个是右侧的返回顶部,分别如图 ...
 
随机推荐
- 图解集合2:LinkedList
			
初识LinkedList 上一篇中讲解了ArrayList,本篇文章讲解一下LinkedList的实现. LinkedList是基于链表实现的,所以先讲解一下什么是链表.链表原先是C/C++的概念,是 ...
 - 【C语言学习】《C Primer Plus》第4章 字符串和格式化输入/输出
			
学习总结 1.String str=”hello world!”;(Java),char[20]=” hello world!”;(C).其实Java字符串的实现,也是字符数组. 2.字符串的尾部都会 ...
 - Razor.js,基于JavaScript的Razor实现
			
哈罗大家好,之前造了JS模板轮子Otmpl,虽然勉强算不错,但是和MVC Razor的简洁优雅相比,简直是惨不忍睹.经过几天的研究,终于在参考国外一些牛人的代码后,展现出第一版,欢迎各位园友拍砖讨论. ...
 - 一个简单的、面向对象的javascript基础框架
			
如果以后公司再能让我独立做一套新的完整系统,那么我肯定会为这个系统再写一个前端框架,那么我到底该如何写这个框架呢? 在我以前的博客里我给大家展示了一个我自己写的框架,由于当时时间很紧张,做之前几乎没有 ...
 - swfupload 例子
			
upload.html <!DOCTYPE html> <html lang="en"> <head> <script type='tex ...
 - Vue API阅读的小细节
			
#后面是表达式,下面是参数列表,参数列表每行说明一个参数.每行的参数说明,最后边对应表达式的参数,左边是该参数的类型一类的说明.
 - Java集合框架知识总结
			
两大体系:Collection,Map 一.Collection: List 接口 : List:里面对象全部是有序的(通过三种方法来遍历) ArrayList,LinkedList,Vertor A ...
 - EF架构~为EF DbContext生成的实体添加注释(T5模板应用)
			
回到目录 相关文章系列 第八回 EF架构~将数据库注释添加导入到模型实体类中 第二十一回 EF架构~为EF DbContext生成的实体添加注释(T4模板应用) 第二十二回EF架构~为EF DbCo ...
 - [Java类加载器]Java中classLoader浅析.
			
本文为在公司内部TD上写的一篇小文, 主要讲解java中classLoader基础知识, 现在拿来这里分享一下. 一.问题 请在Eclipse中新建如下类,并运行它: 1 package java.l ...
 - Atitit 订单处理原理与功能设计attilax总结
			
Atitit 订单处理原理与功能设计attilax总结 订单有三大订单分类,商品订单,充值支付订单,报名订单等..1 订单完成流程 "select * from orderv2 where ...