一、Lucene.Net介绍

  Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。开发人员可以基于Lucene.net实现全文检索的功能。   

  Lucene.net是Apache软件基金会赞助的开源项目,基于Apache License协议。   

  Lucene.net并不是一个爬行搜索引擎,也不会自动地索引内容。我们得先将要索引的文档中的文本抽取出来,然后再将其加到Lucene.net索引中。标准的步骤是先初始化一个Analyzer、打开一个IndexWriter、然后再将文档一个接一个地加进去。一旦完成这些步骤,索引就可以在关闭前得到优化,同时所做的改变也会生效。这个过程可能比开发者习惯的方式更加手工化一些,但却在数据的索引上给予你更多的灵活性。

二、盘古分词器                                 

盘古分词是一个中英文分词组件。作者eaglet 曾经开发过KTDictSeg 中文分词组件,拥有大量用户。作者基于之前分词组件的开发经验,结合最新的开发技术重新编写了盘古分词组件。主要有以下功能:

1、中文未登陆词识别

2、词频优先

3、一元分词,多元分词

4、中文人名分词

5、繁体中文分词

6、英文分词

7、用户自定义规则(字典管理,动态加载字典,关键词高亮)

......

三、安装

四、代码分析

1.初始化盘古分词的xml引用路径

  1. /// <summary>
  2. /// 初始化盘古分词的xml引用路径
  3. /// </summary>
  4. /// <param name="PanGuXmlPath"></param>
  5. public static void InitPanGuXmlPath(string PanGuXmlPath)
  6. {
  7. //定义盘古分词的xml引用路径
  8. PanGu.Segment.Init(PanGuXmlPath);
  9. }

2.创建索引

  1. /// <summary>
  2. /// 创建索引
  3. /// </summary>
  4. /// <param name="IndexDic">目录地址</param>
  5. /// <param name="isCreate">是否重新创建</param>
  6. public static void CreateIndex(string IndexDic, bool isCreate)
  7. {
  8. try
  9. {
  10. //创建索引目录
  11. if (!System.IO.Directory.Exists(IndexDic))
  12. {
  13. System.IO.Directory.CreateDirectory(IndexDic);
  14. }
  15. FSDirectory directory = FSDirectory.Open(new DirectoryInfo(IndexDic), new NativeFSLockFactory());
  16. //IndexReader:对索引库进行读取的类
  17. bool isExist = IndexReader.IndexExists(directory);
  18. //是否存在索引库文件夹以及索引库特征文件
  19. if (isExist)
  20. {
  21. //如果索引目录被锁定(比如索引过程中程序异常退出或另一进程在操作索引库),则解锁
  22. //Q:存在问题 如果一个用户正在对索引库写操作 此时是上锁的 而另一个用户过来操作时 将锁解开了 于是产生冲突 --解决方法后续
  23. if (IndexWriter.IsLocked(directory))
  24. {
  25. IndexWriter.Unlock(directory);
  26. }
  27. }
  28. //IndexWriter第三个参数:true指重新创建索引,false指从当前索引追加....此处为新建索引所以为true
  29. IndexWriter writer = new IndexWriter(directory, new PanGuAnalyzer(), isCreate, Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED);
  30. for (int i = ; i < ; i++)
  31. {
  32. //这里是测试数据
  33. AddIndex(writer, "我的标题" + i, i + "标题内容是飞大师傅是地方十大飞啊的飞是 安抚爱上地方 爱上地方" + i, DateTime.Now.AddDays(i).ToString("yyyy-MM-dd"));
  34. AddIndex(writer, "射雕英雄传作者金庸" + i, i + "我是欧阳锋" + i, DateTime.Now.AddDays(i).ToString("yyyy-MM-dd"));
  35. AddIndex(writer, "天龙八部2" + i, i + "慕容废墟,上官静儿,打撒飞艾丝凡爱上,虚竹" + i, DateTime.Now.AddDays(i).ToString("yyyy-MM-dd"));
  36. AddIndex(writer, "倚天屠龙记2" + i, i + "张无忌机" + i, DateTime.Now.AddDays(i).ToString("yyyy-MM-dd"));
  37. AddIndex(writer, "三国演义" + i, i + "刘备,张飞,关羽" + i, DateTime.Now.AddDays(i).ToString("yyyy-MM-dd"));
  38. }
  39. writer.Optimize();
  40. writer.Dispose();
  41. }
  42. catch (Exception ex)
  43. {
  44.  
  45. throw;
  46. }
  47. }
  1. private static void AddIndex(IndexWriter writer, string title, string content, string date)
  2. {
  3. try
  4. {
  5. Document doc = new Document();
  6. doc.Add(new Field("Title", title, Field.Store.YES, Field.Index.NOT_ANALYZED));//存储且索引
  7. doc.Add(new Field("Content", content, Field.Store.YES, Field.Index.ANALYZED));//存储且索引
  8. doc.Add(new Field("AddTime", date, Field.Store.YES, Field.Index.NOT_ANALYZED));//存储且索引
  9. writer.AddDocument(doc);
  10. }
  11. catch (FileNotFoundException fnfe)
  12. {
  13. throw fnfe;
  14. }
  15. catch (Exception ex)
  16. {
  17. throw ex;
  18. }
  19. }

索引器的构造函数参数说明:

IndexDic是索引存放目录

PanGuAnalyzer是盘古解析器(由于默认的解析器解析能力不强,所以替换为这个)

IsCreate是索引创建方式(true:重新新建索引,false:从旧的索引执行追加)

Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED是文件长度是否限制

3.索引生成的文件

4.根据关键字搜索

lucene的搜索相当强大,它提供了很多辅助查询类,每个类都继承自Query类,各自完成一种特殊的查询,你可以像搭积木一样将它们任意组合使用,完成一些复杂操 作;另外lucene还提供了Sort类对结果进行排序,提供了Filter类对查询条件进行限制。你或许会不自觉地拿它跟SQL语句进行比 较:“lucene能执行and、or、order by、where、like ‘%xx%’操作吗?”回答是:“当然没问题!”

  1. /// <summary>
  2. /// 从索引搜索结果
  3. /// </summary>
  4. public static List<Article> SearchIndex(string content, string IndexDic)
  5. {
  6. Dictionary<string, string> dic = new Dictionary<string, string>();
  7. try
  8. {
  9. FSDirectory directory = FSDirectory.Open(new DirectoryInfo(IndexDic), new NoLockFactory());
  10. IndexReader reader = IndexReader.Open(directory, true);
  11. IndexSearcher search = new IndexSearcher(reader);
  12. string[] fields = { "Content" };
  13.  
  14. //创建查询
  15. PerFieldAnalyzerWrapper wrapper = new PerFieldAnalyzerWrapper(new PanGuAnalyzer());
  16. wrapper.AddAnalyzer("Content", new PanGuAnalyzer());
  17. QueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30, fields, wrapper);
  18. Query query = parser.Parse(content);
  19. TopScoreDocCollector collector = TopScoreDocCollector.Create(, true);//10--查询条数
  20.  
  21. search.Search(query, collector);
  22. var hits = collector.TopDocs().ScoreDocs;
  23.  
  24. int numTotalHits = collector.TotalHits;
  25. List<Article> list = new List<Article>();
  26. for (int i = ; i < hits.Length; i++)
  27. {
  28. var hit = hits[i];
  29. Document doc = search.Doc(hit.Doc);
  30. Article model = new Article()
  31. {
  32. Title = doc.Get("Title").ToString(),
  33. Content = doc.Get("Content").ToString(),
  34. AddTime = doc.Get("AddTime").ToString()
  35. };
  36. list.Add(model);
  37. //list.Add(SetHighlighter(dicKeywords, model));
  38. }
  39. return list;
  40. }
  41. catch (Exception ex)
  42. {
  43. throw;
  44. }
  45. }

介绍各种Query

TermQuery: 首先介绍最基本的查询,如果你想执行一个这样的查询:在content字段中查询包含‘刘备的document”,那么你可以用TermQuery

BooleanQuery :如果你想这么查询:在content字段中包含”刘备“并且在title字段包含”三国“的document”,那么你可以建立两个TermQuery并把它们用BooleanQuery连接起来:

WildcardQuery :如果你想对某单词进行通配符查询,你可以用WildcardQuery,通配符包括’?’匹配一个任意字符和’*’匹配零个或多个任意字符,例如你搜索’三国*’,你可能找到’三国演义’或者’三国志’

PhraseQuery :你可能对中日关系比较感兴趣,想查找‘中’和‘日’挨得比较近(5个字的距离内)的文章,超过这个距离的不予考虑,

PrefixQuery :如果你想搜以‘中’开头的词语,你可以用PrefixQuery:

FuzzyQuery :FuzzyQuery用来搜索相似的term,使用Levenshtein算法。

RangeQuery: 另一个常用的Query是RangeQuery,你也许想搜索时间域从20060101到20060130之间的document,你可以用RangeQuery

Lucene.Net3.0.3+盘古分词器学习使用的更多相关文章

  1. Lucene.Net+盘古分词器(详细介绍)(转)

    出处:http://www.cnblogs.com/magicchaiy/archive/2013/06/07/LuceneNet%E7%9B%98%E5%8F%A4%E5%88%86%E8%AF%8 ...

  2. Lucene.Net+盘古分词器(详细介绍)

    本章阅读概要1.Lucenne.Net简介2.介绍盘古分词器3.Lucene.Net实例分析4.结束语(Demo下载)Lucene.Net简介 Lucene.net是Lucene的.net移植版本,是 ...

  3. 【原创】Lucene.Net+盘古分词器(详细介绍)

    本章阅读概要 1.Lucenne.Net简介 2.介绍盘古分词器 3.Lucene.Net实例分析 4.结束语(Demo下载) Lucene.Net简介 Lucene.net是Lucene的.net移 ...

  4. 转:solr6.0配置中文分词器IK Analyzer

    solr6.0中进行中文分词器IK Analyzer的配置和solr低版本中最大不同点在于IK Analyzer中jar包的引用.一般的IK分词jar包都是不能用的,因为IK分词中传统的jar不支持s ...

  5. 我与solr(六)--solr6.0配置中文分词器IK Analyzer

    转自:http://blog.csdn.net/linzhiqiang0316/article/details/51554217,表示感谢. 由于前面没有设置分词器,以至于查询的结果出入比较大,并且无 ...

  6. lucene 3.0.2 中文分词

    package lia.meetlucene; import java.io.IOException; import java.io.Reader; import java.io.StringRead ...

  7. Net Core使用Lucene.Net和盘古分词器 实现全文检索

    Lucene.net Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎, ...

  8. Linux下,非Docker启动Elasticsearch 6.3.0,安装ik分词器插件,以及使用Kibana测试Elasticsearch,

    Linux下,非Docker启动Elasticsearch 6.3.0 查看java版本,需要1.8版本 java -version yum -y install java 创建用户,因为elasti ...

  9. Solr6.5.0配置中文分词器配置

    准备工作: solr6.5.0安装成功 1.去官网https://github.com/wks/ik-analyzer下载IK分词器 2.Solr集成IK a)将ik-analyzer-solr6.x ...

随机推荐

  1. vue 登录跳转

    前几次做登录处理,都是写一个公用方法,然后在对应的路由页面调用,即判断是不是处于登录状态,如果不是,就返回登录页面. let exit = (vm)=>{ let login = session ...

  2. linux常见命令实践.

    ls -la : 给出当前目录下所有文件的一个长列表,包括以句点开头的“隐藏”文件 ls -a . .. 1 online_tools online_tools_0803 ll: 竖列显示所有文件 l ...

  3. WARN [wxpay java sdk] - report fail. reason: report.mch.weixin.qq.com:80 failed to respond

    最近小程序接口 tomcat日志经常出现此类警告 WARN [wxpay java sdk] - report fail. reason: report.mch.weixin.qq.com:80 fa ...

  4. 【RL-TCPnet网络教程】第32章 RL-TCPnet之Telnet服务器

    第32章      RL-TCPnet之Telnet服务器 本章节为大家讲解RL-TCPnet的Telnet应用,学习本章节前,务必要优先学习第31章的Telnet基础知识.有了这些基础知识之后,再搞 ...

  5. [Swift]LeetCode710. 黑名单中的随机数 | Random Pick with Blacklist

    Given a blacklist B containing unique integers from [0, N), write a function to return a uniform ran ...

  6. [Swift]LeetCode743. 网络延迟时间 | Network Delay Time

    There are N network nodes, labelled 1 to N. Given times, a list of travel times as directededges tim ...

  7. [Swift]LeetCode948. 令牌放置 | Bag of Tokens

    You have an initial power P, an initial score of 0 points, and a bag of tokens. Each token can be us ...

  8. Java货币金额转换为大写形式

    package com.test; import java.math.BigDecimal; /** * * * 数字转换为汉语中人民币的大写<br> * */ public class ...

  9. presto中ldaps配置完整流程

    最近开始转战presto,至于前面章节中的Hbase,我也会持续更新,喜欢我的可以关注我.关于这个流程,我看过阿里云的的一篇文章,但看后还是不知所云,就写下了这篇博客,大家感兴趣的可以访问那篇文章—— ...

  10. 如何优雅的利用Windows服务来部署ASP.NET Core程序

    上一篇文章中我给大家讲述了五种部署ASP.NET Core网站的方法,其中有一种方式是通过Windows服务来进行部署,这样既可以做到开启自启动,又不会因为iis的反向代理而损失部分性能.但是美中不足 ...