Lucene.Net 与 盘古分词
1.关键的一点,Lucene.Net要使用3.0下面的版本号,否则与盘古分词接口不一致。 
关键代码例如以下
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Lucene.Net.Analysis;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Search;
using Lucene.Net.Store;
using Lucene.Net.Analysis.PanGu;
using Maticsoft.DBUtility;
using System.Data;
using System.Diagnostics;
namespace SearchSentence
{
    class Program
    {
        public static string[] SplitWords(string content)
        {
            List<string> strList = new List<string>();
            Analyzer analyzer = new PanGuAnalyzer();//指定使用盘古 PanGuAnalyzer 分词算法
            TokenStream tokenStream = analyzer.TokenStream("", new StringReader(content));
            Lucene.Net.Analysis.Token token = null;
            while ((token = tokenStream.Next()) != null)
            { //Next继续分词 直至返回null
                strList.Add(token.TermText()); //得到分词后结果
            }
            return strList.ToArray();
        }
        public static void CreateIndex(string strDirectory)
        {
            FSDirectory directory = FSDirectory.Open(new DirectoryInfo(strDirectory), new NativeFSLockFactory());
            //IndexReader:对索引库进行读取的类
            bool isExist = IndexReader.IndexExists(directory); //是否存在索引库文件夹以及索引库特征文件
            if (isExist)
            {
                //假设索引文件夹被锁定(比方索引过程中程序异常退出或还有一进程在操作索引库)。则解锁
                //Q:存在问题 假设一个用户正在对索引库写操作 此时是上锁的 而还有一个用户过来操作时 将锁解开了 于是产生冲突 --解决方法兴许
                if (IndexWriter.IsLocked(directory))
                {
                    IndexWriter.Unlock(directory);
                }
            }
            //创建向索引库写操作对象  IndexWriter(索引文件夹,指定使用盘古分词进行切词,最大写入长度限制)
            //补充:使用IndexWriter打开directory时会自己主动对索引库文件上锁
            IndexWriter writer = new IndexWriter(directory, new PanGuAnalyzer(), !isExist, IndexWriter.MaxFieldLength.UNLIMITED);
            DataSet ds = DbHelperSQL.Query("select * from dbo.Sentences", 100);
            DataTable dt = ds.Tables[0];
            int rowsCount = dt.Rows.Count;
            for (int n = 0; n < rowsCount; n++)
            {
                if (dt.Rows[n]["Id"].ToString() != "" && dt.Rows[n]["TextZh"].ToString() != "")
                {
                    //--------------------------------遍历数据源 将数据转换成为文档对象 存入索引库
                    Document document = new Document(); //new一篇文档对象 --一条记录相应索引库中的一个文档
                    //向文档中加入字段  Add(字段,值,是否保存字段原始值,是否针对该列创建索引)
                    document.Add(new Field("id", dt.Rows[n]["Id"].ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));//--全部字段的值都将以字符串类型保存 由于索引库仅仅存储字符串类型数据
                    //Field.Store:表示是否保存字段原值。
指定Field.Store.YES的字段在检索时才干用document.Get取出原值
                    //Field.Index.NOT_ANALYZED:指定不依照分词后的结果保存--是否按分词后结果保存取决于是否对该列内容进行模糊查询
                    document.Add(new Field("TextZh", dt.Rows[n]["TextZh"].ToString(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS));
                    //Field.Index.ANALYZED:指定文章内容依照分词后结果保存 否则无法实现兴许的模糊查询
                    //WITH_POSITIONS_OFFSETS:指示不仅保存切割后的词 还保存词之间的距离
                    //document.Add(new Field("content", "我常常出去玩", Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS));
                    writer.AddDocument(document); //文档写入索引库
                    Console.Write("{0}\r", n+1);
                }
            }
            writer.Close();//会自己主动解锁
            directory.Close(); //不要忘了Close,否则索引结果搜不到
        }
        public static void Query(string strQuery)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            FSDirectory directory = FSDirectory.Open(new DirectoryInfo("CH-EG"), new NoLockFactory());
            IndexReader reader = IndexReader.Open(directory, true);
            IndexSearcher searcher = new IndexSearcher(reader);
            //搜索条件
            PhraseQuery query = new PhraseQuery();
            //把用户输入的关键字进行分词
            foreach(string word in SplitWords(strQuery)) {
                query.Add(new Term("TextZh", word));
            }
            //query.Add(new Term("content", "C#"));//多个查询条件时 为且的关系
            query.SetSlop(100); //指定关键词相隔最大距离
            //TopScoreDocCollector盛放查询结果的容器
            TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true);
            searcher.Search(query, null, collector);//依据query查询条件进行查询,查询结果放入collector容器
            sw.Stop();
            //TopDocs 指定0到GetTotalHits() 即全部查询结果中的文档 假设TopDocs(20,10)则意味着获取第20-30之间文档内容 达到分页的效果
            ScoreDoc[] docs = collector.TopDocs(0, collector.GetTotalHits()).scoreDocs;
            //展示数据实体对象集合
            for (int i = 0; i < docs.Length; i++)
            {
                int docId = docs[i].doc;//得到查询结果文档的id(Lucene内部分配的id)
                Document doc = searcher.Doc(docId);//依据文档id来获得文档对象Document
                Console.Write("{0}\n", doc.Get("TextZh"));
            }
            TimeSpan ts2 = sw.Elapsed;
            Console.WriteLine("本次查询总共花费{0}ms.\n", ts2.TotalMilliseconds);  
        }
        static void Main(string[] args)
        {
            //CreateIndex("CH-EG");
            Console.Write("Press phrase: \n");
            string strQuery = Console.ReadLine();
            while (strQuery != "")
            {
                Query(strQuery);
                Console.Write("Press phrase: \n");
                strQuery = Console.ReadLine();
            }
        }
    }
}
Lucene.Net 与 盘古分词的更多相关文章
- Lucene.net 全文检索 盘古分词
		lucene.net + 盘古分词 引用: 1.Lucene.Net.dll 2.PanGu.Lucene.Analyzer.dll 3.PanGu.HighLight.dll 4.PanGu.dll ... 
- Lucene.Net和盘古分词应用
		Lucene.Net.dll:用做全文索引 PanGu.dll(盘古分词):作为中文分词的条件 大致原理: 1.Lucene先根据PanGu将需要搜索的内容分隔.分词,然后根据分词的结果,做一个索引页 ... 
- Net Core使用Lucene.Net和盘古分词器 实现全文检索
		Lucene.net Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎, ... 
- Lucene.net入门学习(结合盘古分词)
		Lucene简介 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整 ... 
- Lucene.net入门学习(结合盘古分词)(转载)
		作者:释迦苦僧 出处:http://www.cnblogs.com/woxpp/p/3972233.html 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显 ... 
- 【原创】Lucene.Net+盘古分词器(详细介绍)
		本章阅读概要 1.Lucenne.Net简介 2.介绍盘古分词器 3.Lucene.Net实例分析 4.结束语(Demo下载) Lucene.Net简介 Lucene.net是Lucene的.net移 ... 
- 站内搜索——Lucene +盘古分词
		为了方便的学习站内搜索,下面我来演示一个MVC项目. 1.首先在项目中[添加引入]三个程序集和[Dict]文件夹,并新建一个[分词内容存放目录] Lucene.Net.dll.PanGu.dll.Pa ... 
- Lucene.Net+盘古分词->开发自己的搜索引擎
		//封装类 using System;using System.Collections.Generic;using System.Linq;using System.Web;using Lucene. ... 
- Lucene.Net+盘古分词器(详细介绍)(转)
		出处:http://www.cnblogs.com/magicchaiy/archive/2013/06/07/LuceneNet%E7%9B%98%E5%8F%A4%E5%88%86%E8%AF%8 ... 
随机推荐
- hbase优化小结
			目录: 1,背景 2,GC 3,hbase cache 4,compaction 5,其他 1,背景 项目组中,hbase主要用来备份mysql数据库中的表.主要通过接入mysql binlog,经s ... 
- myBatis逆向生成及使用
			引入数据库驱动 <!-- mybatis逆向生成包 --><dependency> <groupId>org.mybatis.generator</group ... 
- [ NOI 2002 ] Robot
			\(\\\) Description \(\\\) Solution 垃圾语文题毁我青春 这题其实就是重定义了俩函数.... 首先 \(\varphi(1)=0\) . 然后 \(2\) 在计算 \( ... 
- Android基础TOP5_2:MultiAutoCompleteTextView多文本自动补全文本框
			Activity: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmln ... 
- MFC_2.3 定时器、滑块、进度条控件
			定时器.滑块.进度条控件 1.拖控件 2.绑定变量.默认,然后取名字 3.初始化设置定时器 // 设置滑块和进度条的范围 m_TrackBar.SetRange(0, 1000); m_StaticP ... 
- IntelliJ IDEA 2017安装和破解方法
			一,安装 这里是windows下的安装,另外还有mac和linux下的版本,可自行解决 下载并安装IDEA官网:https://www.jetbrains.com/idea/ 或者百度网盘2017版本 ... 
- 梦想CAD控件安卓选择集
			在本示例中将使用构造选择集对被过滤对象进行过滤,该类封装了选择集及其处理函数,支持如下过滤条件. 参数类型 类型 RTDXF0 TEXT 文字 MTEXT 多行文字 CIRCLE 圆 ARC 圆弧 L ... 
- 视频剪辑生成gif格式(php外挂python程序)完美!
			接到朋友的需求,朋友是做php的,让我帮忙处理php生成gif的需求.他的项目类似抖音短视频那种,就是展示出来的界面是gif动图,然后点进去是完整的视频. 我想了想,我倒是没做过php生成gif的需求 ... 
- Luogu P1297 [国家集训队]单选错位
			P1297 [国家集训队]单选错位 题目背景 原 <网线切割>请前往P1577 题目描述 gx和lc去参加noip初赛,其中有一种题型叫单项选择题,顾名思义,只有一个选项是正确答案.试卷上 ... 
- 【tips】xadmin - django第三方后台管理系统
			Django 为大家提供了一个完善的后台管理系统—admin,但是这个后台管理系统总体来说不太适合国人的习惯,所以有大神就使用 bootstrap 和 jQuery,为我们开发了一个第三 方的 Dja ... 
