利用Lucene.net搭建站内搜索(3)---创建索引
Lucene.net提供了很全面的数据搜索操作,你可以利用Lucene.net检索磁盘中的文件,网页,数据库中的数据,但是前提是预先对数据创建索引。
Lucene索引过程分为三个主要的操作阶段:将数据转换成文本、分析文本、并将分析过的文本保存到索引库中。如图所示:
1.数据转成文本:须将数据转换成Lucene能够处理的格式——纯文本字符流。
2.分析文本:完成了针对待索引数据的预处理操作,并创建了带有若干个域的Document对象,就可以调用IndexWriter的addDocument(Document)方法,将数据传递给Lucene来进行索引操作。在对数据进行索引处理时,Lucene会首先分析(analyze)数据使之更加适合被索引。
3.将分析过的文本保存到索引库中:对输入数据分析处理完之后,就可以将结果写入到索引文件中。Lucene将输入数据以一种称为倒排索引(inverted index)的数据结构进行存储。在进行关键字快速查找时,这种数据结构能够有效地利用磁盘空间。
下面介绍下Lucene.net中处理索引的类:
IndexWriter
IndexWriter是索引中负责操作的核心,它负责把索引文件写入存储介质,是控制逻辑存储转换为物理存储的纽带。
Document
Document就是一条虚拟记录,可以理解为数据里的一行。正是有了它,才使我们可以很方便并且易于理解地操作索引文件。它一般记录了需要用到的一个文档的属性,当然,这需要和Field联合使用。
Field
Field类就是数据库里的一列。一个文档有标题,内容,作者,创建时间这四个属性的话,那么就需要四个Field保存这些属性,然后把四个Field加入到Document中。
Field的构造函数比较多。其中Store,Index和TermVector是通过内部类指定的。
(1)--Store 有三个选项:
Field.Store.COMPRESS表示被压缩存储;
Field.Store.YES表示储存;
Field.Store.NO表示不被存储。
(2)--Index的选项有四个:
Field.Index.NO表示不建立索引;
Field.Index.TOKENIZED表示分词后索引;
Index.NO_NORMS表示值存储内容;
Field.Index.UN_TOKENIZED表示不分词索引。
(3)--TermVector这个参数也不常用,它有五个选项。
Field.TermVector.NO表示不索引Token的位置属性;
Field.TermVector.WITH_OFFSETS表示额外索引Token的结束点;
Field.TermVector.WITH_POSITIONS表示额外索引Token的当前位置;
Field.TermVector.WITH_POSITIONS_OFFSETS表示额外索引Token的当前和结束位置;
Field.TermVector.YES则表示存储向量。
通过实例生成数据索引:
这里我将数据保存在Access数据库中,对Access数据库中的数据进行索引:
保存数据的表:数据库中保存了1000条数据
为数据创建索引代码:
![](/assets/blank.gif)
![](/assets/blank.gif)
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
using System.Data.SqlClient;
using Lucene.Net.Analysis;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Analysis.KTDictSeg;
using LuceneSearch;
/// <summary>
/// CreateIndex 的摘要说明
/// </summary>
public class CreateIndex
{
//词库路径
public string wordPath;
public string indexDirectory;
//定义一个IndexWriter
protected IndexWriter writer = null;
//需要导出的数目
public int allNum;
//当前完成的数目
public int completeNum;
//需要生成的表
public DataTable dt;
DAL.OperSql os = new DAL.OperSql();
public CreateIndex()
{
}
public void GetIndex(int inum)
{
//定义分析器
Analyzer KTDAnalyzer = new KTDictSegAnalyzer(wordPath);
//PerFieldAnalyzerWrapper可以对不同的Field进行不同的分析
PerFieldAnalyzerWrapper wrapper = new PerFieldAnalyzerWrapper(KTDAnalyzer);
wrapper.AddAnalyzer("ID", KTDAnalyzer);
wrapper.AddAnalyzer("News_Url", KTDAnalyzer);
wrapper.AddAnalyzer("News_Date", KTDAnalyzer);
//判断是否已有索引
bool isure = !IndexReader.IndexExists(indexDirectory);
//创建索引的数据条数
allNum = dt.Rows.Count;
//创建IndexWriter
writer = new IndexWriter(indexDirectory, wrapper, isure);
writer.SetUseCompoundFile(true); //显式设置索引为复合索引
writer.SetMaxFieldLength(int.MaxValue); //设置域最大长度为最大值
writer.SetMergeFactor(allNum + 100); //设置每100个段合并成一个大段
writer.SetMaxMergeDocs(10000); //设置一个段的最大文档数
writer.SetMaxBufferedDocs(1000); //设置在把索引写入磁盘前内存里文档的缓存个数
//创建IndexReader
IndexReader reader = null;
bool needre = inum == 1;
reader = IndexReader.Open(indexDirectory);
for (int i = 0; i < dt.Rows.Count; i++)
{
completeNum = i + 1;
string body = parseHtml(dt.Rows[i]["News_Body"].ToString());
string title = parseHtml(dt.Rows[i]["News_Title"].ToString());
if (title.Length > 2 && body.Length > 2)
{
if (needre)
{
Term term = new Term("ID", dt.Rows[i]["ID"].ToString());
reader.DeleteDocuments(term);
}
Document document = new Document();
document.Add(new Field("ID", dt.Rows[i]["ID"].ToString() ?? "", Field.Store.YES, Field.Index.UN_TOKENIZED));
document.Add(new Field("News_Title", title, Field.Store.NO, Field.Index.TOKENIZED));
document.Add(new Field("News_Body", body, Field.Store.NO, Field.Index.TOKENIZED));
document.Add(new Field("News_Url", dt.Rows[i]["News_Url"].ToString() ?? "", Field.Store.YES, Field.Index.UN_TOKENIZED));
document.Add(new Field("News_Date", DateField.DateToString(Convert.ToDateTime(dt.Rows[i]["News_Date"].ToString())) ?? "", Field.Store.YES, Field.Index.UN_TOKENIZED));
writer.AddDocument(document);;
}
}
reader.Close();
writer.Optimize();
writer.Close();
}
}
传入参数,生成索引文件:
![](/assets/blank.gif)
![](/assets/blank.gif)
try
{
ci.wordPath = Server.MapPath("App_Data") + @"\"; //词库路径;
ci.indexDirectory = Server.MapPath("index") + @"\"; //词库路径;
ci.dt = dt;
ci.GetIndex(1);
}
其中dt是保存数据的DataTable,wordpath是分词器的词库文件chsstopwords.txt,engstopwords.txt,dict.dct的路径,indexDirectory是生成索引文件的路径。
生成索引成功后,我们会在index文件夹下看到生成的文件:
这样,我们就创建好了数据的索引。检索数据的时候,我们就可以利用它快速的对数据进行检索。
转载于:https://www.cnblogs.com/gaoweipeng/archive/2009/09/25/1573118.html
利用Lucene.net搭建站内搜索(3)---创建索引相关推荐
- 一步步开发自己的博客 .NET版(5、Lucenne.Net 和 必应站内搜索)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) ...
- ajax+lucene pdf,基于Ajax/Lucene的站内搜索技术研究
摘要: 站内搜索引擎是找出网站重要信息的必要工具,高效的站内搜索将有助于提升网站的价值,发挥网站应有的作用.虽然现在一些网络巨头已开始研究并应用这类工具,但整个互联网行业中,受制于技术的门槛,真正的站 ...
- 站内搜索——Lucene +盘古分词
为了方便的学习站内搜索,下面我来演示一个MVC项目. 1.首先在项目中[添加引入]三个程序集和[Dict]文件夹,并新建一个[分词内容存放目录] Lucene.Net.dll.PanGu.dll.Pa ...
- Lucene.net站内搜索—5、搜索引擎第一版实现
目录 Lucene.net站内搜索-1.SEO优化 Lucene.net站内搜索-2.Lucene.Net简介和分词 Lucene.net站内搜索-3.最简单搜索引擎代码 Lucene.net站内搜索 ...
- php站内搜索seo屏蔽黑帽,【seo培训班】这样防止站内搜索被黑帽seo利用
[seo培训班]这样防止站内搜索被黑帽seo利用 我们有时候做网站,要特别注意一些细节之处,因为可能会在你想象不到的地方没准在黑帽SEO看来就非常有价值并且可以加以利用.而且,一般黑帽SEO发现了漏洞 ...
- 使用 Swiftype 给 Hexo 搭建的博客添加站内搜索功能
当我们的 博客 文章变的越来越多的时候,就非常需要使用 站内搜索 功能,否则寻找某一篇文章就会变的麻烦,Swiftype 是一个非常好的站内搜索平台,并且是 免费 的,可以到 我的博客 去预览一下搜索 ...
- 如何使用hugo搭建个人博客(五):添加站内搜索(gcse)
站内搜索推荐使用google custom search engine(gsce) gcse的使用方法强烈推荐阅读:Hexo博客优化配置之–为自己博客添加站内搜索 关键部分: 下面介绍如何在crisp ...
- java实现站内搜索
1.站内搜索 在以往的网站建设,企业系统的搭建过程中,因为信息比较简单,比较少,站内搜索可能不是必要的选项,而今,时代的发展, 信息量的增大,网站逻辑的复杂,企业自身对信息架构.管理.发布的需求,以及 ...
- 用全文检索构建站内搜索和大数据搜索引擎
全文检索首先对要搜索的文档进行分词,然后形成索引,通过查询索引来查询文档.全文检索是目前搜索引擎,大数据搜索的关键技术.全文检索系统可实现亚秒级的检索速度以及每秒上百次的并发检索支持. 需求: 实现淘 ...
最新文章
- autoware中lgsvl Simulator安装与使用:LGsvl Simulator 2021.2.1版(九)
- SQLDMO- (数据备份与恢复篇)
- 【FPGA】FIFO的Verilog设计之同步FIFO的设计
- vistualSVN server:Windows下SVN服务器利器
- C# WebAPI中DateTime类型字段在使用微软自带的方法转json格式后默认含T的解决办法...
- JSON 解析的两种方法
- spring四种依赖注入方式
- 谷歌浏览器怎么截图 Google Chrome截图方法
- java从键盘上录入学生人数和每个学生的姓名以及分数,按照分数降序输出,学生名次、学生姓名、学生分数
- 企业微信怎么输入服务器id,系统账号绑定企业微信成员id
- android fragment 设置透明,Android透明DialogFragment
- 心理软件测试自学,软件测试中的心理学
- Circular microphone array 1
- java语言编译_java在线编译-编译,java
- linux获取sata端口,经过设备名,获取接口类型 SATA,USB, ESATA接口
- 【Algorithm】算法设计与分析(第二版)- 王红梅 - JAVA实现:3.2 分式化简。设计算法,将一个给定的真分数化简为最简分数形式。例如,将6/8化简为3/4
- 几分钟搞定,文件名称中文转英文
- 数字IC后端工程师应该如何快速入门提高工作技能?
- 区块链公司BitFury与联合国合作开展哈萨克斯坦的森林项目
- 关于oracle驱动jiar包版本问题导致的ORA-01460【mybatis+Oracle】