信息检索论文-基于lucene的实验_第1页
信息检索论文-基于lucene的实验_第2页
信息检索论文-基于lucene的实验_第3页
信息检索论文-基于lucene的实验_第4页
信息检索论文-基于lucene的实验_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于Lucene的实验报告信息检索系统介绍信息检索系统是借助信息检索技术,如全文检索等手段帮助用户检索特定信息的工具。它可以正确地表示,存储和组织信息,同时还提供信息的访问。在这里,信息的概念是非常广泛的,它可以是一篇文章,一个文本,一个网页,一封电子邮件,一张照片,甚至是一个收集的虚拟信息。检索的整个过程包括:文本数据库的构建、索引和检索。信息检索的过程:1建立一个文本库一个信息检索系统需要准备之前,搜索功能的开发。首先,必须建立一个文本数据库。该文本数据库用于存储用户可以检索的所有信息。在此基础上,确定了检索系统中的文本模型。文本模型是一种被系统识别的信息格式,具有冗余性低等特点。当然,在系统的运行过程中,文本数据库的信息可能会不断变化。2建立索引当您拥有文本模型时,您应该创建一个基于数据库中的文本的索引.。索引可以大大提高信息检索的速度。建立索引的方法有多种,这取决于信息检索系统的大小。大规模的信息检索系统(如百度,谷歌,如搜索引擎)被用来创建一个倒排索引。3搜索索引文本后,可以开始搜索它。搜索请求通常由用户提交,请求进行分析,检索结果返回索引中。Lucene随着系统信息的越来越多,怎么样从这些信息海洋中捞起自己想要的那一根针就变得非常重要了,全文检索是通常用于解决此类问题的方案,而Lucene则为实现全文检索的工具,任何应用都可通过嵌入它来实现全文检索。Lucene是一个开源全文检索工具包,它是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene工作方式lucene提供的服务实际包含两部分:一入一出。所谓入是写入,即将你提供的源(本质是字符串)写入索引或者将其从索引中删除;所谓出是读出,即向用户提供全文搜索服务,让用户可以通过关键词定位源。写入流程

源字符串首先经过analyzer处理,包括:分词,分成一个个单词;去除stopword(可选)。

将源中需要的信息加入Document的各个Field中,并把需要索引的Field索引起来,把需要存储的Field存储起来。

将索引写入存储器,存储器可以是内存或磁盘。读出流程

用户提供搜索关键词,经过analyzer处理。对处理后的关键词搜索索引找出对应的Document。

用户根据需要从找到的Document中提取需要的Field。我们可以看到,Lucene的使用主要体现在两个步骤:1创建索引,通过IndexWriter对不同的文件进行索引的创建,并将其保存在索引相关文件存储的位置中。2通过索引查询关键字文档一些需要用到的概念analyzer

Analyzer

是分析器,它的作用是把一个字符串按某种规则划分成一个个词语,并去除其中的无效词语,这里说的无效词语是指英文中的“of”、

“the”,中文中的

“的”、“地”等词语,这些词语在文章中大量出现,但是本身不包含什么关键信息,去掉有利于缩小索引文件、提高效率、提高命中率。分词的规则千变万化,但目的只有一个:按语义划分。这点在英文中比较容易实现,因为英文本身就是以单词为单位的,已经用空格分开;而中文则必须以某种方法将连成一片的句子划分成一个个词语。具体划分方法下面再详细介绍,这里只需了解分析器的概念即可。document

用户提供的源是一条条记录,它们可以是文本文件、字符串或者数据库表的一条记录等等。一条记录经过索引之后,就是以一个Document的形式存储在索引文件中的。用户进行搜索,也是以Document列表的形式返回。field

一个Document可以包含多个信息域,例如一篇文章可以包含“标题”、“正文”、“最后修改时间”等信息域,这些信息域就是通过Field在Document中存储的。

Field有两个属性可选:存储和索引。通过存储属性你可以控制是否对这个Field进行存储;通过索引属性你可以控制是否对该Field进行索引。这看起来似乎有些废话,事实上对这两个属性的正确组合很重要,下面举例说明:

是以刚才的文章为例子,我们需要对标题和正文进行全文搜索,所以我们要把索引属性设置为真,同时我们希望能直接从搜索结果中提取文章标题,所以我们把标题

域的存储属性设置为真,但是由于正文域太大了,我们为了缩小索引文件大小,将正文域的存储属性设置为假,当需要时再直接读取文件;我们只是希望能从搜索解

果中提取最后修改时间,不需要对它进行搜索,所以我们把最后修改时间域的存储属性设置为真,索引属性设置为假。上面的三个域涵盖了两个属性的三种组合,还

有一种全为假的没有用到,事实上Field不允许你那么设置,因为既不存储又不索引的域是没有意义的。term

term是搜索的最小单位,它表示文档的一个词语,term由两部分组成:它表示的词语和这个词语所出现的field。

tocken

tocken是term的一次出现,它包含trem文本和相应的起止偏移,以及一个类型字符串。一句话中可以出现多次相同的词语,它们都用同一个term表示,但是用不同的tocken,每个tocken标记该词语出现的地方。Lucene所需要用到的外部工具八爪鱼采集器八爪鱼数据采集系统以完全自主研发的分布式云计算平台为核心,可以在很短的时间内,轻松从各种不同的网站或者网页获取大量的规范化数据,帮助任何需要从网页获取信息的客户实现数据自动化采集,编辑,规范化,摆脱对人工搜索及收集数据的依赖,从而降低获取信息的成本,提高效率。云采集:采集任务自动分配到云端多台服务器同时执行,提高采集效率,可以很短的时间内获取成千上万条信息拖拽式采集流程:模拟人的操作思维模式,可以登陆,输入数据,点击链接,按钮等,还能对不同情况采取不同的采集流程。图文识别:内置可扩展的OCR接口,支持解析图片中的文字,可将图片上的文字提取出来。中文分词中文分词是处理中文信息的基础与关键。由于Lucene自带的分词器对英文的分词效果较好,但对中文的分词效果并不如意。为了使检索系统能更好的处理中文信息,本文采用了IKAnalyzer作为分词器。IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.X则发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。IKAnalyzer的特性:采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力。采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。优化的词典存储,更小的内存占用。支持用户词典扩展定义针对Lucene全文检索优化的查询分析器IKQueryParser;采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率。Lucene创建及使用方法1.写入流程:即创建索引首先实例化一个构造器IndexWriter

writer

=

new

IndexWriter("D:/index/",

new

IKAnalyzer(),

true);

//索引的存储位置

这个构造函数具有三个参数:path:索引文件存放的路径。如:Stringpath="E:\\index";

a:分词工具,因为lucene为外国人所开发,所以对中文分词不是很友好,这里引入IKAnalyzer专门针对中文的分词。。如:a=newIKAnalyzer()create:它是一个boolean型变量,如果为true,表示要重写指定的存放索引目录下的索引文件;如果为false,表示在指定存放索引目录下已经存在的索引文件的基础上,向其中继续追加新的索引文件。二、

创建索引第一步并未创建索引,只是实例化了一个索引器,建立索引的过程是在一个IndexWriter索引器实例存在的前提下,通过为其添加Document,这样才能真正添加索引。

索引是信息检索引擎工作的第一步,只有建立了索引才能进行信息检索。Lucene用Document逻辑文件和Field域来组织各种数据源。Document向Lucene提供原始的要索引的文本内容,Lucene从Document中取出相关的数据源,并根据属性配置进行相应的处理,建立索引。

代码如下:foreach(variteminproductlist){Documentdoc=newDocument();doc.Add(newField("id",item.id.ToString(),Field.Store.YES,Field.Index.UN_TOKENIZED));//其中ID、Name、Add都是数据库中的字段名,doc.Add(newField("productname",ductname,Field.Store.YES,Field.Index.TOKENIZED));doc.Add(newField("productdes",ductdes,Field.Store.YES,Field.Index.UN_TOKENIZED));doc.Add(newField("tradename",item.tradename,Field.Store.YES,Field.Index.UN_TOKENIZED));doc.Add(newField("companyname",panyname,Field.Store.YES,Field.Index.UN_TOKENIZED));doc.Add(newField("fhdes",item.fhdes,Field.Store.YES,Field.Index.TOKENIZED));doc.Add(newField("pic",item.pic,Field.Store.YES,Field.Index.UN_TOKENIZED));doc.Add(newField("areaname",item.areaname,Field.Store.YES,Field.Index.UN_TOKENIZED));doc.Add(newField("tradeid",item.tradeid.ToString(),Field.Store.YES,Field.Index.UN_TOKENIZED));writer.AddDocument(doc);}1.

Field:可以理解成索引文件中一个个的字段块,占用空间按字段长度分配。2.

Store:一个内部类,它是static的,主要为了设置Field的存储属性.

public

static

final

Store

COMPRESS

=

new

Store("COMPRESS");

//

在索引中压缩存储Field的值

public

static

final

Store

YES

=

new

Store("YES");//在索引中存储Field的值

public

static

final

Store

NO

=

new

Store("NO");

//

在索引中不存储Field的值3.

Index:

通过Index设置索引方式,,不对Field进行索引,所以这个Field就不能被检索到(一般来说,建立索引而使它不被检索,这是没有意义的),如果对该Field还设置了Field.Store为Field.Store.YES或Field.Store.COMPRESS,则可以检索ublic

static

final

Index

TOKENIZED

=

new

Index("TOKENIZED");

//

对Field进行索引,同时还要对其进行分词(由Analyzer来管理如何分词)

public

static

final

Index

UN_TOKENIZED

=

new

Index("UN_TOKENIZED");

//

对Field进行索引,但不对其进行分词

public

static

final

Index

NO_NORMS

=

new

Index("NO_NORMS");

//

对Field进行索引,但是不使用Analyzer三、

优化索引,关闭写入

writer.Optimize();

//添加完所有document,我们对索引进行优化,优化主要是将多个索引文件合并到一个,有利于提高索引速度。

writer.Close();//随后将writer关闭,这点很重要。2.读出流程(即使用索引)1.

创建一个容器来存放你从索引文件中读取到的数据,这里我们使用Table

private

DataTable

dt()

{

DataTable

mytab

=

new

DataTable();

mytab.Columns.Add("ID");

mytab.Columns.Add("TRADENAME");

mytab.Columns.Add("AREANAME");

mytab.Columns.Add("COMPANYNAME");

mytab.Columns.Add("FHDES");

mytab.Columns.Add("PRODUCTNAME");

mytab.Columns.Add("PIC");

mytab.Clear();

return

mytab;

}2.

读取索引文件中的数据private

IndexSearcher

LuceneSource()

{

string

INDEX_STORE_PATH

=

"D:/index/";

//INDEX_STORE_PATH

为索引存储目录

return

new

IndexSearcher(INDEX_STORE_PATH);

}3.Lucene的搜索

Lucene建立了功能强大的索引机制为搜索服务,这是因为在检索系统的使用中,用户体验最深的还是搜索部分。如果这一部分的性能无法达到用户要求,那么软件就没有太大的意义。Lucene的搜索相当强大,它提供了很多辅助查询类,每个类都继承自Query类,各自完成一种特殊的查询,你可以像搭积木一样将它们任意组合使用,完成一些复杂操作;另外lucene还提供了Sort类对结果进行排序,提供了Filter类对查询条件进行限制。你或许会不自觉地拿它跟SQL语句进行比较:“lucene能执行and、or、orderby、where、like‘%xx%’操作吗?”回答是:“当然没问题!”Lucene中有各种各样的Query

下面我们看看lucene到底允许我们进行哪些查询操作:TermQuery首先介绍最基本的查询,如果你想执行一个这样的查询:“在content域中包含‘lucene’的document”,那么你可以用TermQuery:Term

t

=

new

Term("content",

"

lucene";

Query

query

=

new

TermQuery(t);

BooleanQuery如果你想这么查询:“在content域中包含java或perl的document”,那么你可以建立两个TermQuery并把它们用BooleanQuery连接起来:

TermQuery

termQuery1

=

new

TermQuery(new

Term("content",

"java");

TermQuery

termQuery

2

=

new

TermQuery(new

Term("content",

"perl");

BooleanQuery

booleanQuery

=

new

BooleanQuery();

booleanQuery.add(termQuery

1,

BooleanClause.Occur.SHOULD);

booleanQuery.add(termQuery

2,

BooleanClause.Occur.SHOULD);

Tip:清单此处的BooleanClause.Occur,此类有2个重要的属性,SHOULD和MUST,SHOULD你就理解成SQL里’OR’,MUST理解成SQL里的’AND’,

WildcardQuery如果你想对某单词进行通配符查询,你可以用WildcardQuery,通配符包括’?’匹配一个任意字符和’*’匹配零个或多个任意字符,例如你搜索’use*’,你可能找到’useful’或者’useless’:Query

query

=

new

WildcardQuery(new

Term("content",

"use*");

你可能对中日关系比较感兴趣,想查找‘中’和‘日’挨得比较近(5个字的距离内)的文章,超过这个距离的不予考虑,你可以:PhraseQuery

query

=

new

PhraseQuery();

query.setSlop(5);

query.add(new

Term("content

",

“中”));

query.add(new

Term(“content”,

“日”));

那么它可能搜到“中日合作……”、“中方和日方……”,PrefixQuery如果你想搜以‘中’开头的词语,你可以用PrefixQuery:PrefixQuery

query

=

new

PrefixQuery(new

Term("content

",

"中");

FuzzyQueryFuzzyQuery用来搜索相似的term,使用Levenshtein算法。假设你想搜索跟‘wuzza’相似的词语,你可以:Query

query

=

new

FuzzyQuery(new

Term("content",

"wuzza");

你可能得到„fuzzy‟和„wuzzy‟。

RangeQuery另一个常用的Query是RangeQuery,你也许想搜索时间域从20060101到20060130之间的document,你可以用RangeQuery:RangeQuery

query

=

new

RangeQuery(new

Term(“time”,

“20060101”),

new

Term(“time”,

“20060130”),

true);

最后的true表示用闭合区间。4.取得从索引文件中过滤后的数据有时你想要一个排好序的结果集,就像SQL语句的“order

by”,lucene能做到:通过Sort。private

Hits

LuceneFilteridSource(BooleanQuery

bq)

{

IndexSearcher

mysearch

=

LuceneSource();

Sort

sort

=

new

Sort(new

SortField("ID",

SortField.DOC,

false));//排序

return

mysearch.Search(bq,

sort);

}Sort是对数据进行排序,比如这里对ID进行排序.注意,LUCENE不支持关键词为空的情况,所以如果你想把索引文件中所有的数据都调用出来,那可以用如下方法for

(int

i

=

0;

i

<

mysearch.MaxDoc();

i++)

{

Document

doc

=

mysearch.Doc(i);

FillingTable(mytab,

doc);

}5.把过滤后的数据并扔入Table数据源

private

void

FillingTable(DataTable

dt,

Document

doc)

{

DataRow

myrow;

myrow

=

dt.NewRow();

myrow[0]

=

doc.Get("id").ToString();

myrow[1]

=

doc.Get("tradename").ToString();

myrow[2]

=

doc.Get("areaname").ToString();

myrow[3]

=

doc.Get("companyname").ToString();

myrow[4]

=

doc.Get("fhdes").ToString();

myrow[5]

=

doc.Get("productname").ToString();

myrow[6]

=

doc.Get("pic").ToString();

dt.Rows.Add(myrow);

myrow.AcceptChanges();

}从Lucene中学到更多Luene的确是一个面对对象设计的典范

(1)所有的问题都通过一个额外抽象层来方便以后的扩展和重用:你可以通过重新实现来达到自己的目的,而对其他模块而不需要;

(2)简单的应用入口Searcher,

Indexer,并调用底层一系列组件协同的完成搜索任务;

(3)所有的对象的任务都非常专一:比如搜索过程:QueryParser分析将查询语句转换成一系列的精确查询的组合(Query),通过底层的索引读取结构IndexReader进行索引的读取,并用相应的打分器给搜索结果进行打分/排序等。所有的功能模块原子化程度非常高,因此可以通过重新实现而不需要修改其他模块。

(4)除了灵活的应用接口设计,Lucene还提供了一些适合大多数应用的语言分析器实现(SimpleAnalyser,StandardAnalyser),这也是新用户能够很快上手的重要原因之一。这些优点都是非常值得在以后的开发中学习借鉴的。作为一个通用工具包,Lunece的确给予了需要将全文检索功能嵌入到应用中的开发者很多的便利。此外,通过对Lucene的学习和使用,我也更深刻地理解了为什么很多数据库优化设计中要求,比如:

(1)尽可能对字段进行索引来提高查询速度,但过多的索引会对数据库表的更新操作变慢,而对结果过多的排序条件,实际上往往也是性能的杀手之一。

(2)很多商业数据库对大批量的数据插入操作会提供一些优化参数,这个作用和索引器的merge_factor的作用是类似的,

(3)20%/80%原则:查的结果多并不等于质量好,尤其对于返回结果集很大,如何优化这头几十条结果的质量往往才是最重要的。

(4)尽可能让应用从数据库中获得比较小的结果集,因为即使对于大型数据库,对结果集的随机访问也是一个非常消耗资源的操作。参考文献[1]

刘奕群,马少平。搜索引擎技术基础[M].清华大学出版社.2010.07

[2]

罗刚.解密搜索引擎技术实战:Lucene

&

Java精华版(第2版)[M].电子工业出版社.2014.01

[3]

耿祥义,张跃平.java程序设计实用教程[M].人民邮电出版社.2012.06

[4]

郭克华,李敏.javaWeb程序设计.清华大学出版社.2013.01[5]李刚,宋伟,邱哲.征服Ajax+Lucene构建搜索引擎[M].北京:人民邮电出版社.2006.

[5]

张校乾,金玉玲,侯丽波.一种基于Lucene检索引擎的全文数据库的研究与实现[J].现代图书情报技术.2005.基于C8051F单片机直流电动机反馈控制系统的设计与研究基于单片机的嵌入式Web服务器的研究MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究基于模糊控制的电阻钎焊单片机温度控制系统的研制基于MCS-51系列单片机的通用控制模块的研究基于单片机实现的供暖系统最佳启停自校正(STR)调节器单片机控制的二级倒立摆系统的研究基于增强型51系列单片机的TCP/IP协议栈的实现基于单片机的蓄电池自动监测系统基于32位嵌入式单片机系统的图像采集与处理技术的研究基于单片机的作物营养诊断专家系统的研究基于单片机的交流伺服电机运动控制系统研究与开发基于单片机的泵管内壁硬度测试仪的研制基于单片机的自动找平控制系统研究基于C8051F040单片机的嵌入式系统开发基于单片机的液压动力系统状态监测仪开发模糊Smith智能控制方法的研究及其单片机实现一种基于单片机的轴快流CO〈,2〉激光器的手持控制面板的研制基于双单片机冲床数控系统的研究基于CYGNAL单片机的在线间歇式浊度仪的研制基于单片机的喷油泵试验台控制器的研制基于单片机的软起动器的研究和设计基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究基于单片机的机电产品控制系统开发基于PIC单片机的智能手机充电器基于单片机的实时内核设计及其应用研究基于单片机的远程抄表系统的设计与研究基于单片机的烟气二氧化硫浓度检测仪的研制基于微型光谱仪的单片机系统单片机系统软件构件开发的技术研究基于单片机的液体点滴速度自动检测仪的研制基于单片机系统的多功能温度测量仪的研制基于PIC单片机的电能采集终端的设计和应用基于单片机的光纤光栅解调仪的研制气压式线性摩擦焊机单片机控制系统的研制基于单片机的数字磁通门传感器基于单片机的旋转变压器-数字转换器的研究基于单片机的光纤Bragg光栅解调系统的研究单片机控制的便携式多功能乳腺治疗仪的研制基于C8051F020单片机的多生理信号检测仪基于单片机的电机运动控制系统设计Pico专用单片机核的可测性设计研究基于MCS-51单片机的热量计基于双单片机的智能遥测微型气象站MCS-51单片机构建机器人的实践研究基于单片机的轮轨力检测基于单片机的GPS定位仪的研究与实现基于单片机的电液伺服控制系统用于单片机系统的MMC卡文件系统研制基于单片机的时控和计数系统性能优化的研究基于单片机和CPLD的粗光栅位移测量系统研究单片机控制的后备式方波UPS提升高职学生单片机应用能力的探究基于单片机控制的自动低频减载装置研究基于单片机控制的水下焊接电源的研究基于单片机的多通道数据采集系统基于uPSD3234单片机的氚表面污染测量仪的研制基于单片机的红外测油仪的研究96系列单片机仿真器研究与设计基于单片机的单晶金刚石刀具刃磨设备的数控改造基于单片机的温度智能控制系统的设计与实现基于MSP430单片机的电梯门机控制器的研制基于单片机的气体测漏仪的研究基于三菱M16C/6N系列单片机的CAN/USB协议转换器基于单片机和DSP的变压器油色谱在线监测技术研究基于单片机的膛壁温度报警系统设计基于AVR单片机的低压无功补偿控制器的设计基于单片机船舶电力推进电机监测系统基于单片机网络的振动信号的采集系统基于单片机的大容量数据存储技术的应用研究基于单片机的叠图机研究与教学方法实践基于单片机嵌入式Web服务器技术的研究及实现基于AT89S52单片机的通用数据采集系统基于单片机的多道脉冲幅度分析仪研究机器人旋转电弧传感角焊缝跟踪单片机控制系统基于单片机的控制系统在PLC虚拟教学实验中的应用研究基于单片机系统的网络通信研究与应用基于PIC16F877单片机的莫尔斯码自动译码系统设计与研究基于单片机的模糊控制器在工业电阻炉上的应用研究基于双单片机冲床数控系统的研究与开发基于Cygnal单片机的μC/OS-Ⅱ的研究基于单片机的一体化智能差示扫描量热仪系统研究基于TCP/IP协议的单片机与Internet互联的研究与实现变频调速液压电梯单片机控制器的研究基于单片机γ-免疫计数器自动换样功能的研究与实现基于单片机的倒立摆控制系统设计与实现单片机嵌入式以太网防盗报警系统基于51单片机的嵌入式Internet系统的设计与实现单片机监测系统在挤压机上的应用MSP430单片机在智能水表系统上的研究与应用\t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论