Lucene.Net3.0.3应用
来源:互联网 发布:上海人口普查数据 编辑:程序博客网 时间:2024/06/06 00:12
目录
文档目录:
- 目录
- LuceneNet303应用
- 简介
- LuceneNet的主要概念
- Directoy
- IndexWriter
- Analyzer
- Document and Fields
- Searcher and IndexReader
- QueryParser
- LuceneNet的第一个应用
- Lucenenet主要使用步骤
Lucene.Net3.0.3应用
简介
Lucene.Net是Lucene的.Net移植版本,它不是一个完整的全文检索引擎,而是一个开源的全文检索引擎开发包,提供了完整的查询引擎和索引引擎。它的功能就是将文本数据按照某种分词算法进行切词,将分词后的结果存储在索引库。
Lucene.Net的主要概念:
Directoy
该目录是存储Lucene索引的目录:它可以是文件系统(FSDirectory)上的物理文件夹,也可以是存储文件(RAMDirectory)的内存区域。索引结构与Lucene的所有端口兼容,所以你也可以使用.NET进行索引,并用Java进行搜索,反之亦然(需要使用文件系统目录进行索引文件的存储)。
IndexWriter
这个组件负责索引的管理。它创建索引,向索引添加文档,优化索引。
Analyzer
这是索引的复杂性所在。简而言之,分析器包含从文本中提取索引术语的策略。在核心库和contrib项目(一些爱好者贡献的)中都有几种分析器。
Lucene.Net中内置的几个分词器:分析器StandardAnalyzer,它基于欧洲语言文法标记文本,将所有内容设置为小写字母,并删除英文不动词。SimpleAnalyzer:可以按标点符号分词,WhitesspaceAnalyzer:按空格分词,还有一些是爱好者所写的 CJKAnalyzer:这个是二元分词,也就是可以把一段文字分成两个字两个字的样式(如:欢迎你们大家,被分成欢迎、迎你、你们、们大、大家),这些分词器对中文的支持都不是很好。
无论是上面的一元分词还是二元分词,分词效率比较高,但是分出许多无用词。查询效率低。所以我们项目中使用最多的也就是基于词库的分词,有庖丁解牛、盘古分词等。效率比一元分词和二元分词要低,但是准确率是非常高的。
Document and Fields
文档是放入索引的单个实体。它包含许多领域,就像在数据库中一样(Document 就相当于数据库中的一条记录,而field就相当于数据库中的字段),构成文档的单个不同的信息片段。不同的领域可以使用不同的算法和分析器进行索引。例如,您可能只想存储文档ID,而不想进行搜索。但是,您希望能够通过标签来搜索单个关键字,最后,您希望为全文搜索(因此使用分析器和标记器)对博客主体进行索引。
Searcher and IndexReader
Searcher是在IndexReader的帮助下扫描索引文件并根据提供的查询返回结果的组件。
QueryParser
查询解析器负责解析一串文本以创建一个查询对象。它评估Lucene的查询语法,并使用一个分词器(这应该是你用来索引文本的分词器对应)来标记化单个语句。
Lucene.Net的第一个应用
首先导入相应的Dll,使用NuGet下载Lucene.Net.Dll和以及所使用的分词盘古分词的dll,PanGu.Dll和PanGu.Lucene.Analyzer(使用NuGet下载盘古分词的Dll时能直接兼容Lucene.Net3.0.3版本,盘古分词所用的词库也会自动下载)。
Lucene.net主要使用步骤:
第1步 - 初始化目录和IndexWriter
第2步 - 将文档添加到索引
第3步 - 创建查询
第4步 - 将查询传递给IndexSearcher
第5步 - 迭代结果
第6步 – 释放资源
使用Directory加载索引目录(IndexDir),把数据(博主使用的是5个txt文本文件,这个可以自己创建,下面的path变量就是对应的文件的目录)加载到索引目录中
Stopwatch sw = new Stopwatch(); sw.Start(); IndexWriter writer = null; //Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30); Analyzer analyzer = new PanGuAnalyzer(); Lucene.Net.Store.Directory dir = FSDirectory.Open(new System.IO.DirectoryInfo("IndexDir")); try { ////IndexReader:对索引进行读取的类。 //该语句的作用:判断索引库文件夹是否存在以及索引特征文件是否存在。 bool isCreate = !IndexReader.IndexExists(dir); writer = new IndexWriter(dir, analyzer, isCreate, IndexWriter.MaxFieldLength.UNLIMITED); //添加索引 for (int i = 1; i <=5; i++) { Document doc = new Document(); string path = System.IO.Directory.GetParent(System.IO.Directory.GetCurrentDirectory()).Parent.FullName + @"\Data\Test\" + i + ".txt"; string text = File.ReadAllText(path, Encoding.Default); //Field.Store.YES:表示是否存储原值。只有当Field.Store.YES在后面才能用doc.Get("number")取出值来.Field.Index. NOT_ANALYZED:不进行分词保存 doc.Add(new Field("number", i.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED)); // Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS:不仅保存分词还保存分词的距离。 doc.Add(new Field("body", text, Field.Store.YES,Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS)); writer.AddDocument(doc); } writer.Optimize(); sw.Stop(); } catch (Exception ex) { throw; } finally { if (writer != null) writer.Dispose(); if (dir != null) dir.Dispose(); }
创建查询并迭代查询
private void btn_Search_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(this.txtSearch.Text)) MessageBox.Show("请输入搜索的文本"); StringBuilder sb = new StringBuilder(); Stopwatch sw = new Stopwatch(); sw.Start(); //索引库目录 Lucene.Net.Store.Directory dir = FSDirectory.Open(new System.IO.DirectoryInfo("IndexDir"), new NoLockFactory()); IndexReader reader = IndexReader.Open(dir, true); IndexSearcher search = null; try { search = new IndexSearcher(reader); QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "body", new PanGuAnalyzer()); Query query = parser.Parse(LuceneHelper.GetKeyWordSplid(this.txtSearch.Text)); //执行搜索,获取查询结果集对象 TopDocs ts = search.Search(query, null, 1000); ///获取命中的文档信息对象 ScoreDoc[] docs = ts.ScoreDocs; sw.Stop(); this.listBox.Items.Clear(); for (int i = 0; i < docs.Length; i++) { int docId = docs[i].Doc; Document doc = search.Doc(docId); this.listBox.Items.Add(doc.Get("number") + "\r\n"); this.listBox.Items.Add(doc.Get("body")+"\r\n"); this.listBox.Items.Add("------------------------\r\n"); } } catch (Exception ex) { throw; } finally { if (search != null) search.Dispose(); if (dir != null) dir.Dispose(); } this.label.Text = "搜索用时:"; this.timeBox.Text = sw.ElapsedMilliseconds + "毫秒"; }//帮助类,对搜索的关键词进行分词 public class LuceneHelper { public static string GetKeyWordSplid(string keywords) { StringBuilder sb = new StringBuilder(); Analyzer analyzer = new PanGuAnalyzer(); TokenStream stream = analyzer.TokenStream(keywords, new StringReader(keywords)); ITermAttribute ita = null; bool hasNext = stream.IncrementToken(); while (hasNext) { ita = stream.GetAttribute<ITermAttribute>(); sb.Append(ita.Term + " "); hasNext = stream.IncrementToken(); } return sb.ToString(); } }
- Lucene.Net3.0.3应用
- commons-net3的一些应用
- Lucene应用
- lucene应用
- lucene应用
- .Net3.5中var的应用
- lucene的首次应用
- lucene....highlight应用
- Lucene学习笔记(应用)
- lucene 简单应用
- 初次应用lucene
- Lucene基本应用示例
- lucene全文检索应用
- lucene.net 应用资料
- Lucene的基本应用
- Lucene中的堆应用
- Lucene原理与应用
- Lucene初步应用
- PHP “htmlspecialchars()”缓冲区溢出漏洞
- webdynpro dropdownbykey的使用
- 8.5 日期的格式化(format 方法)
- mysql二
- 虚拟机加载机制
- Lucene.Net3.0.3应用
- IIS 发布网站时,出现未能写出错/拒绝访问
- 高性能队列Disruptpor核心源码解析
- 安装node版本管理工具之NVM
- 近邻KNN识别算法实施方案选择
- opencv3.1 ffmpeg和ippicv下载
- Spectrum公司新增SCAPP选件——方便GPU信号处理
- 第七章:断言
- ListView 点餐实例