利用Lucene.net搭建站内搜索(3)---创建索引

news/2024/5/17 14:07:45/文章来源:https://blog.csdn.net/weixin_34358365/article/details/85504991

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条数据
 

为数据创建索引代码:

Code
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();

    }
}

传入参数,生成索引文件:

Code
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文件夹下看到生成的文件:

这样,我们就创建好了数据的索引。检索数据的时候,我们就可以利用它快速的对数据进行检索。



    文章作者:高维鹏(Brian)
    文章出处:http://www.cnblogs.com/gaoweipeng
    欢迎转载,转载时请注明出处。谢谢合作。

分类: Search Engine, Lucene.net

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_787451.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实用用网站推荐:你可能不知道的10个图标搜索引擎

设计师们在工作中经常需要用到各种图标素材&#xff0c;虽然网上能搜到很多的图标资源网站&#xff0c;但要找到免费的高质量图标却很难。之前笔者也向大家分享过8个超棒的免费高质量图标搜索引擎&#xff0c;今天与大家分享另外一些优秀的免费质量图标搜索引擎&#xff0c;相信…

演练2-5 电影网站的功能扩展

原文链接&#xff1a; http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-edit-methods-and-edit-view http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-new-field-to-the-movie-model-and-table …

利用 itms-services 协议,通过网站来发布ipa应用

2019独角兽企业重金招聘Python工程师标准>>> 苹果允许用itms-services协议来直接在iphone/ipad上安装应用程序&#xff0c;我们可以直接生成该协议需要的相关文件&#xff0c;这样产品经理和测试都可以直接在设备上安装新版的应用&#xff1a; 需要两个文件&#xf…

nginx(7):使用nginx的proxy_cache做网站缓存

2019独角兽企业重金招聘Python工程师标准>>> 为什么要做web cache&#xff0c;我想大家最主要的是解决流量的压力。随着网站流量的提升&#xff0c;如果只是单台机器既处理静态文件&#xff0c;又处理动态脚本&#xff0c;显然效率很难上升&#xff0c;不能处理日益…

网站安全认证系统的设计变迁-5中网占安全认证方案的chm下载

为什么80%的码农都做不了架构师&#xff1f;>>> 网站系统的安全认证一共经历了6个阶段&#xff1a; 阶段1-单应用服务器&#xff0c;单数据库服务器 阶段2-单web服务器,多应用服务器模式 阶段3-单web服务器&#xff0c;多应用服务器cache 阶段4-按照业务进行切分阶…

php婚纱网站设计论文,thinkPHP的婚纱购物商城网站的设计与实现

婚姻是每个人的人生大事&#xff0c;所以很多时候如何能够保留住自己最漂亮的这一时刻是很多人多在考虑的一个问题&#xff0c;在结婚的时候大家都会穿上漂亮的婚纱来进行拍照和举行仪式&#xff0c;所以如何选取更加漂亮和适合自己的婚纱是每个人都会遇到的问题&#xff0c;为…

关于大型网站技术演进的思考(七)--存储的瓶颈(7)

本文开篇提个问题给大家&#xff0c;关系数据库的瓶颈有哪些&#xff1f;我想有些朋友看到这个问题肯定会说出自己平时开发中碰到了一个跟数据库有关的什么什么问题&#xff0c;然后如何解决的等等&#xff0c;这样的答案没问题&#xff0c;但是却没有代表性&#xff0c;如果出…

2021-01-16 JavaScript实例:jQuery实现京东等购物网站 放大镜

话不多说&#xff0c;直接上图 相信大家在浏览大多数网站&#xff0c;尤其是购物网站一定经常见到这种放大镜效果&#xff0c;接下来代码奉上 HTML代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…

监控网站图片下载

1.网站图片域名[root10-6-8-200 libexec]# more /usr/local/nagios/etc/webpage.txt http://radfile.example.info/201108/12/717_20110804012.mp3 http://tvcpic.example.info/smallpic/200309/12/030912_3774.jpg http://iadpic.example.info/200104/20010406/dang01040613.j…

安装了loadrunner11 ,可是登录进入WebTours网站后,点击flights,页面是空白

为什么80%的码农都做不了架构师&#xff1f;>>> 安装了loadrunner11 &#xff0c;可是登录进入WebTours网站后&#xff0c;点击flights&#xff0c;页面是空白的分析原因&#xff1f; 答&#xff1a;原因是数据库冲突。 分析过程&#xff1a; 1、判断本地电脑中安装…

java电影网站开发经验2

2019独角兽企业重金招聘Python工程师标准>>> 其实我没怎么写过技术博客&#xff0c;上学的时候看见作文就头疼的&#xff0c;所以有些地方写的不通顺望见谅&#xff0c;闲话少说入正题。 其实开发一个小网站不是太难&#xff0c;选个自己比较熟悉的语言&#xff0c;…

SharePoint服务器端对象模型 之 访问网站和列表数据(Part 5)

&#xff08;五&#xff09;列表条目&#xff08;SPListItem&#xff09; SharePoint中数据的存储基本上都是通过列表条目来完成&#xff08;文档库中的文档也是一种特殊的列表条目&#xff09;&#xff0c;因此在SharePoint应用开发中&#xff0c;最终是要和列表条目打交道的。…

视频网站报表

当下视频网站的火热程度大家都是有目共睹的&#xff0c;因此也产生了一些网红视频博主&#xff0c;比如深受营长喜爱的papi酱以及papitube的各位po主。 那么&#xff0c;这些网红是怎样使自己的视频迅速走红的&#xff0c;网站是通过哪些标准向广大吃瓜群众推荐视频的&#xff…

网站每日PV/IP统计/总带宽/URL统计脚本分享(依据网站访问日志)

在平时的运维工作中&#xff0c;我们运维人员需要清楚自己网站每天的总访问量、总带宽、ip统计和url统计等。虽然网站已经在服务商那里做了CDN加速&#xff0c;所以网站流量压力都在前方CDN层了像每日PV&#xff0c;带宽&#xff0c;ip统计等数据也都可以在他们后台里查看到的。…

常见互联网网站系统架构图

转载于:https://blog.51cto.com/azhuang/1630890

ST 几个重要的网站

2019独角兽企业重金招聘Python工程师标准>>> https://market.sencha.com/extensions?types%5B%5Dcomponents http://extjs.org.cn/ 转载于:https://my.oschina.net/u/555061/blog/499390

PHP网站验证码不显示的终结解决方案

PHP网站验证码不显示&#xff0c;这个是个很基础的PHP问题了&#xff0c;不过有点时候会比较让开发者比较头疼了。很多解决方案仅仅考虑到gd2&#xff0c;却忽略了另外一个很重要的因素了&#xff0c;相信在了解本教程之后&#xff0c;验证码不显示基本上就不算什么问题了。下面…

关于大型网站技术演进的思考(十七)--网站静态化处理—满足静态化的前后端分离(9)...

2019独角兽企业重金招聘Python工程师标准>>> 出处:夏天的森林博客 前后端分离的主题虽然讲完了&#xff0c;但是前后端分离的内容并没有结束&#xff0c;本篇将继续前后端分离的问题&#xff0c;只不过这次前后端分离的讲述将会围绕着本系列的主题网站静态化进行。在…

招聘网站需求分析

网站定位&#xff1a;建筑行业专业性盈利性招聘网站。 一、主页设计 用户明确要求以下三点&#xff1a; 1、主色调&#xff1a;蓝色。 2、有不同尺寸的广告位。 3、自动刷新。 其余参照以下网站&#xff1a; 4&#xff0c;个人用户注册页面 5&#xff0c;企业注册页面 二、求职…

VS2013自带的Browser Link功能引发浏览localhost网站时不停的轮询

浏览localhost网站时候不管你打开那个页面它都会不停的轮询。据悉这是VS2013自带的Browser Link功能&#xff0c;里面用到SignalR机制 什么是Browser Link功能&#xff0c;什么是SignalR机制大家可以没事去百度了解一下。 Browser Link功能讲解地址&#xff1a;http://www.cxyc…