使用Lucene.NET实现数据检索功能
- 引言
- 案例概要
- 思路
- 分词
- 索引的管理
//指定索引库文件存放文件位置
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();
- 文件检索
//指定索引库文件存放文件位置
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("索引内字段的名称");
}
- 资源
DLL与词库:http://download.csdn.net/detail/aaakingwin/7208679
使用Lucene.NET实现数据检索功能的更多相关文章
- 【转载】使用Lucene.NET实现数据检索功能
1.索引的管理 //指定索引库文件存放文件位置 FSDirectory directory = FSDirectory.Open(new DirectoryInfo(this.IndexDataDir ...
- Lucene最重要的功能是对一段话的分析
Lucene最重要的功能是对一段话的分析
- BuguMongo是一个MongoDB Java开发框架,集成了DAO、Query、Lucene、GridFS等功能
http://code.google.com/p/bugumongo/ 简介 BuguMongo是一个MongoDB Java开发框架,它的主要功能包括: 基于注解的对象-文档映射(Object-Do ...
- 如何使用 Lucene 做网站高亮搜索功能?
现在基本上所有网站都支持搜索功能,现在搜索的工具有很多,比如Solr.Elasticsearch,它们都是基于 Lucene 实现的,各有各的使用场景.Lucene 比较灵活,中小型项目中使用的比较多 ...
- 瞎折腾之 Lucene.Net + MVC 搜索功能(上)
前言 首先,关于Lucene.Net 的文章已经很多了.我这次决定写出来只是为了练练手,虽然在别人看来没什么用,但是自己确实是手动实践了一把.我个人觉得还是有意义的.爱折腾.敢于实践.才能有所收获,才 ...
- 【Lucene】Apache Lucene全文检索引擎架构之搜索功能3
上一节主要总结了一下Lucene是如何构建索引的,这一节简单总结一下Lucene中的搜索功能.主要分为几个部分,对特定项的搜索:查询表达式QueryParser的使用:指定数字范围内搜索:指定字符串开 ...
- 使用 Apache Lucene 和 Solr 4 实现下一代搜索和分析
使用 Apache Lucene 和 Solr 4 实现下一代搜索和分析 使用搜索引擎计数构建快速.高效和可扩展的数据驱动应用程序 Apache Lucene™ 和 Solr™ 是强大的开源搜索技术, ...
- lucene&solr-day1
全文检索课程 Lucene&Solr(1) 1. 计划 第一天:Lucene的基础知识 1.案例分析:什么是全文检索,如何实现全文检索 2.Lucene实现全文检索的流程 a) ...
- Lucene教程 -------(一、初始Lucene)
一.lucene的介绍 lucene是一个全文检索的框架,apache组织提供了一个用java实现的全文检索的开源项目.功能非常的强大,api非常简单,并且有了全文检索的功能支持可以非常方便的实现根据 ...
随机推荐
- 初识ASP.NET CORE:一、HTTP pipeline
完整的http请求在asp.net framework中的处理流程: Asp.Net HttpRequest--> HTTP.exe--> inetinfo.exe(w3wp.exe)-& ...
- python 文件拷贝
用python实现了一个小型的自动发版本的工具.这个“自动发版本”有点虚, 只是简单地把debug 目录下的配置文件复制到指定目录,把Release下的生成文件复制到同一指定,过滤掉不需要的文件夹(. ...
- wpf:小问题总结
1.我们经常在新添加的一个dll的时候,启动程序,会报出找不到对应的dll. 我们需要做如下操作: 1)右击dll,选择属性,改成始终复制
- Python:装饰器
格式:在执行的参数前加上@functon 例1:传一个参数 #模拟验证功能 def login(auth): def fun(arg): #为了避免程序一执行的时候就执行验证,需要再加一层函数. pr ...
- C#键盘钩子 鼠标钩子
最新对C#模拟键盘按键,鼠标操作产生了兴趣.特从网上收集了一些常用的API用来调用键盘,鼠标操作. class Win32API { #region DLL导入 /// <summary> ...
- 《Java程序设计》课程准备之问卷调查
一.你对自己的未来有什么规划?做了哪些准备? 答:未来就是找个好工作,在保证自己与父母生活条件良好的基础上,进一步的提高精神上的需求.如:旅游度假,支持更多业余爱好等.准备就是:好好学习,好好运动,好 ...
- jquery load 加载改造,只加载body
背景: 项目中大量用到了jquery和easyui组件,原生load经常出现主页面异常,原因是组件被重复初始化.也考虑过用iframe,但是在实际项目中的效果,最终取消了iframe方案,也尝试了其他 ...
- Browser设置搜索引擎
Browser设置搜索引擎,在com.android.browser.preferences.GeneralPreferencesFragment中加载R.xml.general_preference ...
- Intellij IDEA 根据数据库自动生成pojo和hbm
新建一个项目,每次写hibernate部分,就觉得pojo和hbm.xml部分很蛋疼.今天搜索了半天,终于知道如何根据数据库自动生成了. Intellij IDEA14创建maven时并不能勾选各种支 ...
- linux ntp 服务器和用户端
ntp 服务器 1.输入 rpm -qa|grep ntp 查看是否安装了ntp服务器 2.如果没安装 yum -y install ntp 安装 3.修改 /etc/ntp.conf 将原serve ...