1.关键的一点,Lucene.Net要使用3.0下面的版本号,否则与盘古分词接口不一致。

关键代码例如以下

  1. using System;
  2. using System.IO;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using Lucene.Net.Analysis;
  7. using Lucene.Net.Documents;
  8. using Lucene.Net.Index;
  9. using Lucene.Net.Search;
  10. using Lucene.Net.Store;
  11. using Lucene.Net.Analysis.PanGu;
  12. using Maticsoft.DBUtility;
  13. using System.Data;
  14. using System.Diagnostics;
  15. namespace SearchSentence
  16. {
  17. class Program
  18. {
  19. public static string[] SplitWords(string content)
  20. {
  21. List<string> strList = new List<string>();
  22. Analyzer analyzer = new PanGuAnalyzer();//指定使用盘古 PanGuAnalyzer 分词算法
  23. TokenStream tokenStream = analyzer.TokenStream("", new StringReader(content));
  24. Lucene.Net.Analysis.Token token = null;
  25. while ((token = tokenStream.Next()) != null)
  26. { //Next继续分词 直至返回null
  27. strList.Add(token.TermText()); //得到分词后结果
  28. }
  29. return strList.ToArray();
  30. }
  31. public static void CreateIndex(string strDirectory)
  32. {
  33. FSDirectory directory = FSDirectory.Open(new DirectoryInfo(strDirectory), new NativeFSLockFactory());
  34. //IndexReader:对索引库进行读取的类
  35. bool isExist = IndexReader.IndexExists(directory); //是否存在索引库文件夹以及索引库特征文件
  36. if (isExist)
  37. {
  38. //假设索引文件夹被锁定(比方索引过程中程序异常退出或还有一进程在操作索引库)。则解锁
  39. //Q:存在问题 假设一个用户正在对索引库写操作 此时是上锁的 而还有一个用户过来操作时 将锁解开了 于是产生冲突 --解决方法兴许
  40. if (IndexWriter.IsLocked(directory))
  41. {
  42. IndexWriter.Unlock(directory);
  43. }
  44. }
  45. //创建向索引库写操作对象 IndexWriter(索引文件夹,指定使用盘古分词进行切词,最大写入长度限制)
  46. //补充:使用IndexWriter打开directory时会自己主动对索引库文件上锁
  47. IndexWriter writer = new IndexWriter(directory, new PanGuAnalyzer(), !isExist, IndexWriter.MaxFieldLength.UNLIMITED);
  48. DataSet ds = DbHelperSQL.Query("select * from dbo.Sentences", 100);
  49. DataTable dt = ds.Tables[0];
  50. int rowsCount = dt.Rows.Count;
  51. for (int n = 0; n < rowsCount; n++)
  52. {
  53. if (dt.Rows[n]["Id"].ToString() != "" && dt.Rows[n]["TextZh"].ToString() != "")
  54. {
  55. //--------------------------------遍历数据源 将数据转换成为文档对象 存入索引库
  56. Document document = new Document(); //new一篇文档对象 --一条记录相应索引库中的一个文档
  57. //向文档中加入字段 Add(字段,值,是否保存字段原始值,是否针对该列创建索引)
  58. document.Add(new Field("id", dt.Rows[n]["Id"].ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));//--全部字段的值都将以字符串类型保存 由于索引库仅仅存储字符串类型数据
  59. //Field.Store:表示是否保存字段原值。
  60. 指定Field.Store.YES的字段在检索时才干用document.Get取出原值
  61. //Field.Index.NOT_ANALYZED:指定不依照分词后的结果保存--是否按分词后结果保存取决于是否对该列内容进行模糊查询
  62. document.Add(new Field("TextZh", dt.Rows[n]["TextZh"].ToString(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS));
  63. //Field.Index.ANALYZED:指定文章内容依照分词后结果保存 否则无法实现兴许的模糊查询
  64. //WITH_POSITIONS_OFFSETS:指示不仅保存切割后的词 还保存词之间的距离
  65. //document.Add(new Field("content", "我常常出去玩", Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS));
  66. writer.AddDocument(document); //文档写入索引库
  67. Console.Write("{0}\r", n+1);
  68. }
  69. }
  70. writer.Close();//会自己主动解锁
  71. directory.Close(); //不要忘了Close,否则索引结果搜不到
  72. }
  73. public static void Query(string strQuery)
  74. {
  75. Stopwatch sw = new Stopwatch();
  76. sw.Start();
  77. FSDirectory directory = FSDirectory.Open(new DirectoryInfo("CH-EG"), new NoLockFactory());
  78. IndexReader reader = IndexReader.Open(directory, true);
  79. IndexSearcher searcher = new IndexSearcher(reader);
  80. //搜索条件
  81. PhraseQuery query = new PhraseQuery();
  82. //把用户输入的关键字进行分词
  83. foreach(string word in SplitWords(strQuery)) {
  84. query.Add(new Term("TextZh", word));
  85. }
  86. //query.Add(new Term("content", "C#"));//多个查询条件时 为且的关系
  87. query.SetSlop(100); //指定关键词相隔最大距离
  88. //TopScoreDocCollector盛放查询结果的容器
  89. TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true);
  90. searcher.Search(query, null, collector);//依据query查询条件进行查询,查询结果放入collector容器
  91. sw.Stop();
  92. //TopDocs 指定0到GetTotalHits() 即全部查询结果中的文档 假设TopDocs(20,10)则意味着获取第20-30之间文档内容 达到分页的效果
  93. ScoreDoc[] docs = collector.TopDocs(0, collector.GetTotalHits()).scoreDocs;
  94. //展示数据实体对象集合
  95. for (int i = 0; i < docs.Length; i++)
  96. {
  97. int docId = docs[i].doc;//得到查询结果文档的id(Lucene内部分配的id)
  98. Document doc = searcher.Doc(docId);//依据文档id来获得文档对象Document
  99. Console.Write("{0}\n", doc.Get("TextZh"));
  100. }
  101. TimeSpan ts2 = sw.Elapsed;
  102. Console.WriteLine("本次查询总共花费{0}ms.\n", ts2.TotalMilliseconds);
  103. }
  104. static void Main(string[] args)
  105. {
  106. //CreateIndex("CH-EG");
  107. Console.Write("Press phrase: \n");
  108. string strQuery = Console.ReadLine();
  109. while (strQuery != "")
  110. {
  111. Query(strQuery);
  112. Console.Write("Press phrase: \n");
  113. strQuery = Console.ReadLine();
  114. }
  115. }
  116. }
  117. }

Demo下载地址 http://download.csdn.net/detail/lampqiu/8909427

Lucene.Net 与 盘古分词的更多相关文章

  1. Lucene.net 全文检索 盘古分词

    lucene.net + 盘古分词 引用: 1.Lucene.Net.dll 2.PanGu.Lucene.Analyzer.dll 3.PanGu.HighLight.dll 4.PanGu.dll ...

  2. Lucene.Net和盘古分词应用

    Lucene.Net.dll:用做全文索引 PanGu.dll(盘古分词):作为中文分词的条件 大致原理: 1.Lucene先根据PanGu将需要搜索的内容分隔.分词,然后根据分词的结果,做一个索引页 ...

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

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

  4. Lucene.net入门学习(结合盘古分词)

    Lucene简介 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整 ...

  5. Lucene.net入门学习(结合盘古分词)(转载)

    作者:释迦苦僧  出处:http://www.cnblogs.com/woxpp/p/3972233.html  本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显 ...

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

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

  7. 站内搜索——Lucene +盘古分词

    为了方便的学习站内搜索,下面我来演示一个MVC项目. 1.首先在项目中[添加引入]三个程序集和[Dict]文件夹,并新建一个[分词内容存放目录] Lucene.Net.dll.PanGu.dll.Pa ...

  8. Lucene.Net+盘古分词->开发自己的搜索引擎

    //封装类 using System;using System.Collections.Generic;using System.Linq;using System.Web;using Lucene. ...

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

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

随机推荐

  1. [转]深入ASP.NET MVC之二:路由模块如何工作

    本文转自:http://www.cnblogs.com/yinzixin/archive/2012/11/05/2754483.html 摘要: 上文分析了UrlRouting模块何时会被触发,本文重 ...

  2. MySQL与Sqlserver数据获取

    由于项目要求,一个.net mvc登录注册的东西网站必须放弃sqlserver数据去使用MySQL数据库,因此我遇到了一些问题,并找出相应的解决方法, 因为sqlserver跟MySQL的数据引擎不同 ...

  3. 纵横填字js

    新数据结构设计: 定义一个map: key是横纵坐标字符串,比如“0,4” value是一个json,包含以下属性:字,横向的词(若 有的话,无的话,空串),纵向的词(若有的话,无的话,空串). 另有 ...

  4. 关于sql的case when用法简述

    刚入手公司项目,需要添加一个功能,用到了SQL的case when以及concat SELECT eve.cc, eve.sc, case concat(cc,sc) ' THEN '' ' THEN ...

  5. TCP/IP和UDP的比较

    TCP.UDP详解 1.传输层存在的必要性 由于网络层的分组传输是不可靠的,无法了解数据到达终点的时间,无法了解数据未达终点的状态.因此有必要增强网络层提供服务的服务质量. 2.引入传输层的原因 面向 ...

  6. Ngnix SSL配置(HTTP、HTTPS兼容)

    一.使用阿里云提供证书 下载aliyun证书for Nginx,解压出两个文件,.pem和.key文件 在nginx安装目录Conf文件夹下新建cert文件夹,拷贝两个密钥文件 二.配置nginx 打 ...

  7. 设置bootstrap modal模态框的宽度和宽度

    (1)修改宽度可以通过修改modal中的modal-dialog这个div宽度实现 <div class="modal-dialog" style="width:6 ...

  8. dutacm.club_1085_Water Problem_(矩阵快速幂)

    1085: Water Problem Time Limit:3000/1000 MS (Java/Others)   Memory Limit:163840/131072 KB (Java/Othe ...

  9. 00Cascading Style Sheet

    Cascading Style Sheet CSS(Cascading Style Sheet)即层叠样式表,简称样式表.要理解层叠样式表的概念先要理解样式的概念.样式就是对网页中的 元素(字体.段落 ...

  10. js 的静态获取和动态获取

    静态获取方法 document.getElementById obj.querySelector obj.querySelectorAll 动态获取方法(每次使用时候会回去重新获取一次) obj.ge ...