Lucene.Net和盘古分词应用
Lucene.Net.dll:用做全文索引
PanGu.dll(盘古分词):作为中文分词的条件
大致原理:
1.Lucene先根据PanGu将需要搜索的内容分隔、分词,然后根据分词的结果,做一个索引页。
2.搜索的时候,直接从索引页里面进行查找个。
直接上代码:
分词演示代码:
protected void Button1_Click(object sender, EventArgs e)
{
ListBox1.Items.Clear(); //标准分词,只能对英文,不能对中文
//Analyzer analyzer = new StandardAnalyzer(); //盘古分词
Analyzer analyzer = new PanGuAnalyzer();
TokenStream tokenStream = analyzer.TokenStream("",new StringReader(txtString.Text));
Lucene.Net.Analysis.Token token = null; //.Next()获取到下一个词
while ((token=tokenStream.Next())!=null)
{
string word = token.TermText();//分到的词
ListBox1.Items.Add(word);
}
}
新建索引代码:演示了两种读取数据的方式
一:文本文件的查找
protected void Button1_Click(object sender, EventArgs e)
{
string indexPath = @"C:\index";//注意和磁盘上文件夹的大小写一致,否则会报错。
FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NativeFSLockFactory());
bool isUpdate = IndexReader.IndexExists(directory);
if (isUpdate)
{
//暂时规定:同时只能有一段代码操作索引库
//如果索引目录被锁定(比如索引过程中程序异常退出),则首先解锁
if (IndexWriter.IsLocked(directory))
{
IndexWriter.Unlock(directory);
}
}
//IndexWriter负责把数据向索引库中写入
IndexWriter writer = new IndexWriter(directory, new PanGuAnalyzer(), !isUpdate, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED);
for (int i = ; i < ; i++)
{
string txt =System.IO.File.ReadAllText(@"D:\net\net\代码\搜索及分词\文章\" + i + ".txt");
Document document = new Document();//文档对象。相当于表的一行记录
document.Add(new Field("number", i.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("body", txt, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
writer.AddDocument(document); }
writer.Close();
directory.Close();//不要忘了Close,否则索引结果搜不到 this.ClientScript.RegisterStartupScript(typeof(indexPage),
"alert", "alert('创建索引完成')", true);
}
二:数据库里面查找数据
protected void Button3_Click(object sender, EventArgs e)
{
string indexPath = @"D:\net\net\代码\搜索及分词\index1";//注意和磁盘上文件夹的大小写一致,否则会报错。
FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NativeFSLockFactory());
bool isUpdate = IndexReader.IndexExists(directory);
if (isUpdate)
{
//暂时规定:同时只能有一段代码操作索引库
//如果索引目录被锁定(比如索引过程中程序异常退出),则首先解锁
if (IndexWriter.IsLocked(directory))
{
IndexWriter.Unlock(directory);
}
}
//IndexWriter负责把数据向索引库中写入
IndexWriter writer = new IndexWriter(directory, new PanGuAnalyzer(), !isUpdate, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED); List<Writings> list = GetData();
foreach (Writings item in list)
{
Document document = new Document();//文档对象。相当于表的一行记录
document.Add(new Field("ID",item.ID.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("Title", item.Title, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
document.Add(new Field("Contents", item.Contents, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
writer.AddDocument(document);
}
writer.Close();
directory.Close();//不要忘了Close,否则索引结果搜不到 this.ClientScript.RegisterStartupScript(typeof(indexPage),
"alert", "alert('创建索引完成')", true);
} private List<Writings> GetData()
{
string conn = "server=.;user id=sa; pwd=123; database=SharesTradeNew";
string sql = "SELECT * FROM dbo.Writings";
SqlDataAdapter da = new SqlDataAdapter(sql,conn);
DataTable dt = new DataTable();
int a=da.Fill(dt);
return Newtonsoft.Json.JsonConvert.DeserializeObject<List<Writings>>(Newtonsoft.Json.JsonConvert.SerializeObject(dt));
}
} public class Writings
{
public int ID { get; set; }
public string Title { get; set; }
public string Contents { get; set; }
}
通过索引查找数据:
对应一:
protected void Button1_Click(object sender, EventArgs e)
{
//“计算机 专业”
string kw = TextBox1.Text;
FSDirectory directory = FSDirectory.Open(new DirectoryInfo(@"c:\index"), new NoLockFactory());
IndexReader reader = IndexReader.Open(directory, true);
IndexSearcher searcher = new IndexSearcher(reader);
PhraseQuery query = new PhraseQuery();//查询条件
foreach (string word in kw.Split(' '))//先用空格,让用户去分词,空格分隔的就是词“计算机 专业”
{
query.Add(new Term("body", word));//Contains("body",word)
}
//where Contains("body","计算机") and Contains("body","专业") query.SetSlop();
TopScoreDocCollector collector = TopScoreDocCollector.create(, true);//盛放搜索结果的容器
searcher.Search(query, null, collector);//用query这个查询条件进行搜索,搜索结果放入collector容器中 List<SearchResult> list = new List<SearchResult>(); // collector.GetTotalHits()查询结果的总条数
ScoreDoc[] docs = collector.TopDocs(, collector.GetTotalHits()).scoreDocs;
for (int i = ; i < docs.Length; i++)
{
int docId = docs[i].doc;//文档编号(lucene.net内部分配的,和number无关)
Document doc = searcher.Doc(docId);//根据文档编号拿到文档对象
string number = doc.Get("number");//取出文档的number字段的值。必须是Field.Store.YES才能取出来
string body = doc.Get("body"); SearchResult sr = new SearchResult();
sr.Body = body;
sr.Number = number; list.Add(sr);
}
Repeater1.DataSource = list;
Repeater1.DataBind();
}
对应二:
protected void Button3_Click(object sender, EventArgs e)
{
//“计算机 专业”
string kw = TextBox3.Text;
FSDirectory directory = FSDirectory.Open(new DirectoryInfo(@"D:\net\net\代码\搜索及分词\index1"), new NoLockFactory());
IndexReader reader = IndexReader.Open(directory, true);
IndexSearcher searcher = new IndexSearcher(reader);
PhraseQuery query = new PhraseQuery();//查询条件
foreach (string word in kw.Split(' '))//先用空格,让用户去分词,空格分隔的就是词“计算机 专业”
{
query.Add(new Term("Contents", word));//Contains("body",word)
//query.Add(new Term("Title", word));
}
//where Contains("body","计算机") and Contains("body","专业") query.SetSlop();
TopScoreDocCollector collector = TopScoreDocCollector.create(, true);//盛放搜索结果的容器
searcher.Search(query, null, collector);//用query这个查询条件进行搜索,搜索结果放入collector容器中 List<Writings> list = new List<Writings>(); // collector.GetTotalHits()查询结果的总条数
ScoreDoc[] docs = collector.TopDocs(, collector.GetTotalHits()).scoreDocs;
for (int i = ; i < docs.Length; i++)
{
int docId = docs[i].doc;//文档编号(lucene.net内部分配的,和number无关)
Document doc = searcher.Doc(docId);//根据文档编号拿到文档对象
string id = doc.Get("ID");//取出文档的number字段的值。必须是Field.Store.YES才能取出来
string title = doc.Get("Title");
string content = doc.Get("Contents"); Writings sr = new Writings();
sr.ID = int.Parse(id);
sr.Title = title;
sr.Contents = content; list.Add(sr);
}
Repeater3.DataSource = list;
Repeater3.DataBind();
}
Lucene.Net和盘古分词应用的更多相关文章
- Lucene.net 全文检索 盘古分词
lucene.net + 盘古分词 引用: 1.Lucene.Net.dll 2.PanGu.Lucene.Analyzer.dll 3.PanGu.HighLight.dll 4.PanGu.dll ...
- Lucene.Net 与 盘古分词
1.关键的一点,Lucene.Net要使用3.0下面的版本号,否则与盘古分词接口不一致. 关键代码例如以下 using System; using System.IO; using System.Co ...
- 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 ...
随机推荐
- opencv3更换图片背景
#include <opencv2/opencv.hpp>#include <iostream> using namespace std;using namespace cv; ...
- loj10088 出纳员问题
传送门 分析 我们设pre[i]为到第i个时段的雇佣员工的总数量,sum[i]表示时段i的可雇佣员工的总数量,r[i]表示时段i所需工人的数量.由此我们不难求出: 0<=pre[i]-pre[i ...
- spark sql建表的异常
在使用spark sql创建表的时候提示如下错误: missing EOF at 'from' near ')' 可以看下你的建表语句中是不是create external table .... ...
- appium自动化安装(二)
第二节 安装Android开发环境 如果你的环境是MAC那么可以直接跳过这一节.就像我们在用Selenium进行web自动化测试的时候一样,我们需要一个浏览器来执行测试脚本.那么移动端自动化测试,我 ...
- 算法导论 寻找第i小元素 9.2
PS1:如果单纯为做出这道题那么这个代价是O(nlgn),通过排序就可以了. 这里讨论的是O(n)的算法.那么来分析一下这个算法是如何做到O(n)的,算了不分析了,这个推到看起来太麻烦了.其实我想知道 ...
- clojure.spec库入门学习
此文已由作者张佃鹏授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. clojure是一门动态类型的语言,在类型检查方面并没有c++/java这种静态类型语言好用,所以多个模块之 ...
- 深入解读Job System(1)
https://mp.weixin.qq.com/s/IY_zmySNrit5H8i0CcTR7Q 通常而言,最好不要把Unity实体组件系统ECS和Job System看作互相独立的部分,要把它们看 ...
- 分数规划-poj3111
题意:给定n个珠宝,每个珠宝有重量 w 和价值v ,要求你从中选出k个,使∑v/∑w 尽可能大,输出选出的珠宝的编号 数据范围: 1 ⩽ k ⩽ n ⩽ 10 , 1 ⩽ w , v ⩽ 10. 这道 ...
- Linux文件属性用户、组、权限
Linux系统中的用户是分角色的,用户的角色是由UID和GID来识别的(也就是说系统识别的是用户的UID.GID,而非用户用户名),有个UID是唯一的(系统中唯一如同身份证一样)用来标识系统的用户账号 ...
- 2019.2.25考试T3, 离线+线段树
\(\color{#0066ff}{题解}\) #include<bits/stdc++.h> #define LL long long LL in() { char ch; LL x = ...