创建索引库
//读取文件,存储到索引库
public string CreateDatebase()
{
//获取索引库的路径
var indexPath = AppDomain.CurrentDomain.BaseDirectory + ConfigurationManager.AppSettings["IndexDateBase"];
FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NoLockFactory());
IndexReader reader = IndexReader.Open(directory, true);
var searcher = new IndexSearcher(reader);
//搜索条件
var query = new PhraseQuery();
foreach (string word in GetPanGuAnalyzer(str))//先用空格,让用户去分词,空格分隔的就是词“计算机 专业”
{
query.Add(new Term("body", word));
}
//组成词的字之间可以允许的距离
query.SetSlop(5);
TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true);
searcher.Search(query, null, collector);//根据query查询条件进行查询,查询结果放入collector容器
ScoreDoc[] docs = collector.TopDocs(0, collector.GetTotalHits()).scoreDocs;//得到所有查询结果中的文档,GetTotalHits():表示总条数 TopDocs(300, 20);//表示得到300(从300开始),到320(结束)的文档内容.
var list = new List<string>();
for (int i = 0; i < docs.Length; i++)
{
int docId = docs[i].doc;//得到查询结果文档的id(Lucene内部分配的id)
Document doc = searcher.Doc(docId);//找到文档id对应的文档详细信息
var _str = doc.Get("body");
list.Add(_str);
}
ViewBag.List = list;
return View();
}
进行搜索
public ActionResult List(string str)
{
//获取索引库的路径
var indexPath = AppDomain.CurrentDomain.BaseDirectory + ConfigurationManager.AppSettings["IndexDateBase"];
FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NoLockFactory());
IndexReader reader = IndexReader.Open(directory, true);
var searcher = new IndexSearcher(reader);
//搜索条件
var query = new PhraseQuery();
foreach (string word in GetPanGuAnalyzer(str))//先用空格,让用户去分词,空格分隔的就是词“计算机 专业”
{
query.Add(new Term("body", word));
}
//组成词的字之间可以允许的距离
query.SetSlop(5);
TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true);
searcher.Search(query, null, collector);//根据query查询条件进行查询,查询结果放入collector容器
ScoreDoc[] docs = collector.TopDocs(0, collector.GetTotalHits()).scoreDocs;//得到所有查询结果中的文档,GetTotalHits():表示总条数 TopDocs(300, 20);//表示得到300(从300开始),到320(结束)的文档内容.
var list = new List<string>();
for (int i = 0; i < docs.Length; i++)
{
int docId = docs[i].doc;//得到查询结果文档的id(Lucene内部分配的id)
Document doc = searcher.Doc(docId);//找到文档id对应的文档详细信息
var _str = doc.Get("body");
list.Add(_str);
}
ViewBag.List = list;
return View();
}
/// 对传递过来的字符串进行盘古分词
/// </summary>
/// <returns></returns>
public static List<string> GetPanGuAnalyzer(string txt)
{
List<string> list = new List<string>();
Analyzer analyzer = new PanGuAnalyzer();
TokenStream tokenStream = analyzer.TokenStream("", new StringReader(txt));
Lucene.Net.Analysis.Token token = null;
while ((token = tokenStream.Next()) != null)
{
list.Add(token.TermText());
}
return list;
}
IndexReader 删除数据
//获取字典
var directory = LucenceHelp.GetDirectory();
//先删除数据
IndexReader reader = IndexReader.Open(directory);
reader.DeleteDocuments(new Term("number", "0"));
reader.IsOptimized();
reader.Close();
IndexWriter 删除数据
//获取字典
var directory = LucenceHelp.GetDirectory();
var writer = new IndexWriter(directory, new PanGuAnalyzer(), false, IndexWriter.MaxFieldLength.UNLIMITED);
//删除的是与要匹配的关键字相关的文件
var term = new Term("body", name);
//删除的是文件名为13的文件
//var term = new Term("number", "13");
writer.DeleteDocuments(term);
writer.Optimize();
writer.Close();
修改索引
Analyzer analyzer = new PanGuAnalyzer();
//获取字典
var directory = LucenceHelp.GetDirectory();
//先删除数据
IndexReader reader = IndexReader.Open(directory);
reader.DeleteDocuments(new Term("number", "0"));
reader.Close();
//再添加数据
IndexWriter writer = new IndexWriter(directory, analyzer, false, IndexWriter.MaxFieldLength.LIMITED);
Document document = new Document();
document.Add(new Field("number", "0", Field.Store.YES, Field.Index.ANALYZED));
document.Add(new Field("body", "如家快捷酒店-0", Field.Store.YES, Field.Index.ANALYZED));
writer.AddDocument(document);
writer.Close();
要添加的文件


- lucence.net+盘古分词
第一步: 添加盘古和lucence的dll引用 第二步: 拷贝Dict文件夹到项目 demo里面是Dictionaries 不过官方建议改成Dict 然后把所有项右击属性 改为“如果较新则复制” 第 ...
- Lucene.net入门学习(结合盘古分词)
Lucene简介 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整 ...
- Lucene.Net3.0.3+盘古分词器学习使用
一.Lucene.Net介绍 Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索 ...
- Lucene.net入门学习(结合盘古分词)(转载)
作者:释迦苦僧 出处:http://www.cnblogs.com/woxpp/p/3972233.html 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显 ...
- 站内搜索——Lucene +盘古分词
为了方便的学习站内搜索,下面我来演示一个MVC项目. 1.首先在项目中[添加引入]三个程序集和[Dict]文件夹,并新建一个[分词内容存放目录] Lucene.Net.dll.PanGu.dll.Pa ...
- Lucene.Net+盘古分词
前言 各位朋友,谢谢大家的支持,由于文件过大,有考虑到版权的问题,故没有提供下载,本人已建立一个搜索技术交流群:77570783,源代码已上传至群共享,需要的朋友,请自行下载! 首先自问自答几个问题, ...
- 完整的站内搜索Demo(Lucene.Net+盘古分词)
前言 首先自问自答几个问题,以让各位看官了解写此文的目的 什么是站内搜索?与一般搜索的区别? 很多网站都有搜索功能,很多都是用SQL语句的Like实现的,但是Like无法做到模糊匹配(例如我搜索“.n ...
- lucene.net 3.0.3、结合盘古分词进行搜索的小例子(转)
lucene.net 3.0.3.结合盘古分词进行搜索的小例子(分页功能) 添加:2013-12-25 更新:2013-12-26 新增分页功能. 更新:2013-12-27 新增按分类查询功能, ...
- 完整的站内搜索实战应用(Lucene.Net+盘古分词)
首先自问自答几个问题,以让各位看官了解写此文的目的 什么是站内搜索?与一般搜索的区别? 多网站都有搜索功能,很多都是用SQL语句的Like实现的,但是Like无法做到模糊匹配(例如我搜索". ...
随机推荐
- Spring单例与线程安全小结
一.Spring单例模式与线程安全 Spring框架里的bean,或者说组件,获取实例的时候都是默认的单例模式,这是在多线程开发的时候要尤其注意的地方. 单例模式的意思就是只有一个实例.单例模式确 ...
- Android 4.2启动代码分析(一)
Android系统启动过程分析 Android系统的框架架构图如下(来自网上): Linux内核启动之后----->就到Android的Init进程 ----->进而启动Android ...
- mongodb cpu 超过100%居高不下的原因分析过程
-- mongodb cpu is high, infomation as below: 1 the message in the http://10.100.1.11:28017/ as below ...
- Root exploit for Android (adb setuid)
/* 本文章由 莫灰灰 编写.转载请注明出处. 作者:莫灰灰 邮箱: minzhenfei@163.com */ 1. 漏洞分析 这是个非常老的漏洞了,主要利用adb启动的时候调用setuid函 ...
- openvswitch常用操作
原理讲解: 当我们创建一个交换机(网桥)之后即(ovs-vsctl add-br brname),此时网络功能不受影响,但是会产生一个虚拟网卡,名字为brname(与网桥名字同名,可以使用 ifcon ...
- FINDPEAKS - matlab函数
FINDPEAKS Find local peaks in data PKS = FINDPEAKS(X) finds local peaks in the data vector X. A loca ...
- JSP标签库
step1: 定义一个标签处理类:改类必须实现SimpleTag接口,在实际中是拓展它的子类SimpleTagSupport.复写doTag方法 public class MyTag extends ...
- mysql 的not null 与 null的区别(转,恍然大悟)
相信很多用了mysql很久的人,对这两个字段属性的概念还不是很清楚,一般会有以下疑问: 1.我字段类型是not null,为什么我可以插入空值 2.为毛not null的效率比null高 3.判断字段 ...
- Effective MySQL之备份与恢复
五分钟成为一名DBA 如果我们已经有了一个MySQL生产级系统,而该产品却没有MySQL备份策略,那么我们至少应该做些什么呢?在采取任何备份策略之前,有许多有关数据库大小和存储策略引擎的用法的预备知识 ...
- Java的基本语法
Java基本语法格式 Java基本语法格式 Java中的所有程序代码都必须存在于一个类中,用class关键字定义类,在class前面可以有一些修饰符. 修饰符 class 类名{ 程序代码} 注: ① ...