信息检索论文基于lucene的实验大学论文.doc

上传人:可****阿 文档编号:91626199 上传时间:2023-05-27 格式:DOC 页数:10 大小:170KB
返回 下载 相关 举报
信息检索论文基于lucene的实验大学论文.doc_第1页
第1页 / 共10页
信息检索论文基于lucene的实验大学论文.doc_第2页
第2页 / 共10页
点击查看更多>>
资源描述

《信息检索论文基于lucene的实验大学论文.doc》由会员分享,可在线阅读,更多相关《信息检索论文基于lucene的实验大学论文.doc(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、 基于Lucene的实验报告 信息检索系统介绍 信息检索系统是借助信息检索技术,如全文检索等手段帮助用户检索特定信息的工具。它可以正确地表示,存储和组织信息,同时还提供信息的访问。在这里,信息的概念是非常广泛的,它可以是一篇文章,一个文本,一个网页,一封电子邮件,一张照片,甚至是一个收集的虚拟信息。检索的整个过程包括:文本数据库的构建、索引和检索。 信息检索的过程: 1 建立一个文本库 一个信息检索系统需要准备之前,搜索功能的开发。首先,必须建立一个文本数据库。该文本数据库用于存储用户可以检索的所有信息。在此基础上,确定了检索系统中的文本模型。文本模型是一种被系统识别的信息格式,具有冗余性低等

2、特点。当然,在系统的运行过程中,文本数据库的信息可能会不断变化。 2建立索引当您拥有文本模型时,您应该创建一个基于数据库中的文本的索引.。索引可以大大提高信息检索的速度。建立索引的方法有多种,这取决于信息检索系统的大小。大规模的信息检索系统(如百度,谷歌,如搜索引擎)被用来创建一个倒排索引。3搜索 索引文本后,可以开始搜索它。搜索请求通常由用户提交,请求进行分析,检索结果返回索引中。 Lucene 随着系统信息的越来越多,怎么样从这些信息海洋中捞起自己想要的那一根针就变得非常重要了,全文检索是通常用于解决此类问题的方案,而Lucene则为实现全文检索的工具,任何应用都可通过嵌入它来实现全文检索

3、。 Lucene是一个开源全文检索工具包,它是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。 Lucene工作方式 lucene提供的服务实际包含两部分:一入一出。所谓入是写入,即将你提供的源(本质是字符串)写入索引或者将其从索引中删除;所谓出是读出,即向用户提供全文搜索服

4、务,让用户可以通过关键词定位源。写入流程源字符串首先经过analyzer处理,包括:分词,分成一个个单词;去除stopword(可选)。将源中需要的信息加入Document的各个Field中,并把需要索引的Field索引起来,把需要存储的Field存储起来。将索引写入存储器,存储器可以是内存或磁盘。读出流程用户提供搜索关键词,经过analyzer处理。对处理后的关键词搜索索引找出对应的Document。用户根据需要从找到的Document中提取需要的Field。我们可以看到,Lucene的使用主要体现在两个步骤:1 创建索引,通过IndexWriter对不同的文件进行索引的创建,并将其保存在索

5、引相关文件存储的位置中。2 通过索引查询关键字文档一些需要用到的概念analyzerAnalyzer是分析器,它的作用是把一个字符串按某种规则划分成一个个词语,并去除其中的无效词语,这里说的无效词语是指英文中的“of”、“the”,中文中的“的”、“地”等词语,这些词语在文章中大量出现,但是本身不包含什么关键信息,去掉有利于缩小索引文件、提高效率、提高命中率。分词的规则千变万化,但目的只有一个:按语义划分。这点在英文中比较容易实现,因为英文本身就是以单词为单位的,已经用空格分开;而中文则必须以某种方法将连成一片的句子划分成一个个词语。具体划分方法下面再详细介绍,这里只需了解分析器的概念即可。d

6、ocument用户提供的源是一条条记录,它们可以是文本文件、字符串或者数据库表的一条记录等等。一条记录经过索引之后,就是以一个Document的形式存储在索引文件中的。用户进行搜索,也是以Document列表的形式返回。field一个Document可以包含多个信息域,例如一篇文章可以包含“标题”、“正文”、“最后修改时间”等信息域,这些信息域就是通过Field在Document中存储的。Field有两个属性可选:存储和索引。通过存储属性你可以控制是否对这个Field进行存储;通过索引属性你可以控制是否对该Field进行索引。这看起来似乎有些废话,事实上对这两个属性的正确组合很重要,下面举例说

7、明:还是以刚才的文章为例子,我们需要对标题和正文进行全文搜索,所以我们要把索引属性设置为真,同时我们希望能直接从搜索结果中提取文章标题,所以我们把标题域的存储属性设置为真,但是由于正文域太大了,我们为了缩小索引文件大小,将正文域的存储属性设置为假,当需要时再直接读取文件;我们只是希望能从搜索解果中提取最后修改时间,不需要对它进行搜索,所以我们把最后修改时间域的存储属性设置为真,索引属性设置为假。上面的三个域涵盖了两个属性的三种组合,还有一种全为假的没有用到,事实上Field不允许你那么设置,因为既不存储又不索引的域是没有意义的。termterm是搜索的最小单位,它表示文档的一个词语,term由

8、两部分组成:它表示的词语和这个词语所出现的field。tockentocken是term的一次出现,它包含trem文本和相应的起止偏移,以及一个类型字符串。一句话中可以出现多次相同的词语,它们都用同一个term表示,但是用不同的tocken,每个tocken标记该词语出现的地方。Lucene所需要用到的外部工具八爪鱼采集器 八爪鱼数据采集系统以完全自主研发的分布式云计算平台为核心,可以在很短的时间内,轻松从各种不同的网站或者网页获取大量的规范化数据,帮助任何需要从网页获取信息的客户实现数据自动化采集,编辑,规范化,摆脱对人工搜索及收集数据的依赖,从而降低获取信息的成本,提高效率。 云采集:采集

9、任务自动分配到云端多台服务器同时执行,提高采集效率,可以很短的时间内 获取成千上万条信息 拖拽式采集流程:模拟人的操作思维模式,可以登陆,输入数据,点击链接,按钮等,还能对不同情况采取不同的采集流程。 图文识别:内置可扩展的OCR接口,支持解析图片中的文字,可将图片上的文字提取出来。 中文分词 中文分词是处理中文信息的基础与关键。由于Lucene自带的分词器对英文的分词效果较好,但对中文的分词效果并不如意。为了使检索系统能更好的处理中文信息,本文采用了IKAnalyzer作为分词器。IK Analyzer是一个开源的,基于java 语言开发的轻量级的中文分词工具包。从2006年12月推出1.0

10、 版开始, IKAnalyzer已经推出了3个大版本。最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer 3.X 则发展为面向Java 的公用分词组件,独立于Lucene 项目,同时提供了对Lucene 的默认优化实现。 IKAnalyzer的特性: l 采用了特有的“正向迭代最细粒度切分算法“,具有60 万字/秒的高速处理能力。 采用了多子处理器分析模式,支持:英文字母(IP 地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。 l 优化的词典存储,更小的内存

11、占用。支持用户词典扩展定义 l 针对Lucene 全文检索优化的查询分析器IKQueryParser;采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene 检索的命中率。 Lucene创建及使用方法1.写入流程:即创建索引一、 首先实例化一个构造器IndexWriterwriter=newIndexWriter(D:/index/,newIKAnalyzer(),true);/索引的存储位置这个构造函数具有三个参数:1. path:索引文件存放的路径。如:String path = E:index;2. a:分词工具,因为lucene为外国人所开发,所以对中文分词不是很友好,

12、 这里引入IKAnalyzer专门针对中文的分词。如:a= new IKAnalyzer()3. create:它是一个boolean型变量,如果为true,表示要重写指定的存放索引目录下的索引文件;如果为false,表示在指定存放索引目录下已经存在的索引文件的基础上,向其中继续追加新的索引文件。二、创建索引第一步并未创建索引,只是实例化了一个索引器,建立索引的过程是在一个IndexWriter索引器实例存在的前提下,通过为其添加Document,这样才能真正添加索引。索引是信息检索引擎工作的第一步,只有建立了索引才能进行信息检索。Lucene用Document逻辑文件和Field域来组织各种

13、数据源。Document向Lucene提供原始的要索引的文本内容,Lucene从Document中取出相关的数据源,并根据属性配置进行相应的处理,建立索引。代码如下: foreach (var item in productlist) Document doc = new Document(); doc.Add(new Field(id, item.id.ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED);/其中ID、Name、Add都是数据库中的字段名, doc.Add(newField(productname,item.produc

14、tname,Field.Store.YES,Field.Index.TOKENIZED); doc.Add(newField(productdes,item.productdes,Field.Store.YES,Field.Index.UN_TOKENIZED); doc.Add(new Field(tradename, item.tradename, Field.Store.YES, Field.Index.UN_TOKENIZED); doc.Add(newField(companyname,panyname,Field.Store.YES,Field.Index.UN_TOKENIZED

15、); doc.Add(new Field(fhdes, item.fhdes, Field.Store.YES, Field.Index.TOKENIZED); doc.Add(new Field(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.Sto

16、re.YES, Field.Index.UN_TOKENIZED); writer.AddDocument(doc); 1.Field:可以理解成索引文件中一个个的字段块,占用空间按字段长度分配。2.Store:一个内部类,它是static的,主要为了设置Field的存储属性.publicstaticfinalStoreCOMPRESS=newStore(COMPRESS);/在索引中压缩存储Field的值publicstaticfinalStoreYES=newStore(YES);/在索引中存储Field的值publicstaticfinalStoreNO=newStore(NO);/在索

17、引中不存储Field的值3.Index:通过Index设置索引方式,,不对Field进行索引,所以这个Field就不能被检索到(一般来说,建立索引而使它不被检索,这是没有意义的),如果对该Field还设置了Field.Store为Field.Store.YES或Field.Store.COMPRESS,则可以检索ublicstaticfinalIndexTOKENIZED=newIndex(TOKENIZED);/对Field进行索引,同时还要对其进行分词(由Analyzer来管理如何分词)publicstaticfinalIndexUN_TOKENIZED=newIndex(UN_TOKEN

18、IZED);/对Field进行索引,但不对其进行分词publicstaticfinalIndexNO_NORMS=newIndex(NO_NORMS);/对Field进行索引,但是不使用Analyzer三、优化索引,关闭写入writer.Optimize();/添加完所有document,我们对索引进行优化,优化主要是将多个索引文件合并到一个,有利于提高索引速度。writer.Close();/随后将writer关闭,这点很重要。2.读出流程(即使用索引)1.创建一个容器来存放你从索引文件中读取到的数据,这里我们使用TableprivateDataTabledt()DataTablemytab

19、=newDataTable();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();returnmytab;2.读取索引文件中的数据privateIndexSearcherLuceneSource()stringINDEX_STORE_PATH=

20、D:/index/;/INDEX_STORE_PATH为索引存储目录returnnewIndexSearcher(INDEX_STORE_PATH);3.Lucene的搜索Lucene建立了功能强大的索引机制为搜索服务,这是因为在检索系统的使用中,用户体验最深的还是搜索部分。如果这一部分的性能无法达到用户要求,那么软件就没有太大的意义。Lucene的搜索相当强大,它提供了很多辅助查询类,每个类都继承自Query类,各自完成一种特殊的查询,你可以像搭积木一样将它们任意组合使用,完成一些复杂操作;另外lucene还提供了Sort类对结果进行排序,提供了Filter类对查询条件进行限制。你或许会不自

21、觉地拿它跟SQL语句进行比较:“lucene能执行and、or、order by、where、like%xx%操作吗?”回答是:“当然没问题!”Lucene中有各种各样的Query下面我们看看lucene到底允许我们进行哪些查询操作:TermQuery首先介绍最基本的查询,如果你想执行一个这样的查询:“在content域中包含lucene的document”,那么你可以用TermQuery:Termt=newTerm(content,lucene;Queryquery=newTermQuery(t);BooleanQuery如果你想这么查询:“在content域中包含java或perl的doc

22、ument”,那么你可以建立两个TermQuery并把它们用BooleanQuery连接起来:TermQuerytermQuery1=newTermQuery(newTerm(content,java);TermQuerytermQuery2=newTermQuery(newTerm(content,perl);BooleanQuerybooleanQuery=newBooleanQuery();booleanQuery.add(termQuery1,BooleanClause.Occur.SHOULD);booleanQuery.add(termQuery2,BooleanClause.Oc

23、cur.SHOULD);Tip:清单此处的BooleanClause.Occur,此类有2个重要的属性,SHOULD和MUST,SHOULD你就理解成SQL里OR,MUST理解成SQL里的AND,WildcardQuery如果你想对某单词进行通配符查询,你可以用WildcardQuery,通配符包括?匹配一个任意字符和*匹配零个或多个任意字符,例如你搜索use*,你可能找到useful或者useless:Queryquery=newWildcardQuery(newTerm(content,use*);你可能对中日关系比较感兴趣,想查找中和日挨得比较近(5个字的距离内)的文章,超过这个距离的不

24、予考虑,你可以:PhraseQueryquery=newPhraseQuery();query.setSlop(5);query.add(newTerm(content,“中”);query.add(newTerm(“content”,“日”);那么它可能搜到“中日合作”、“中方和日方”,PrefixQuery如果你想搜以中开头的词语,你可以用PrefixQuery:PrefixQueryquery=newPrefixQuery(newTerm(content,中);FuzzyQueryFuzzyQuery用来搜索相似的term,使用Levenshtein算法。假设你想搜索跟wuzza相似的词

25、语,你可以:Queryquery=newFuzzyQuery(newTerm(content,wuzza);你可能得到fuzzy和wuzzy。RangeQuery另一个常用的Query是RangeQuery,你也许想搜索时间域从20060101到20060130之间的document,你可以用RangeQuery:RangeQueryquery=newRangeQuery(newTerm(“time”,“20060101”),newTerm(“time”,“20060130”),true);最后的true表示用闭合区间。4.取得从索引文件中过滤后的数据有时你想要一个排好序的结果集,就像SQL语

26、句的“orderby”,lucene能做到:通过Sort。privateHitsLuceneFilteridSource(BooleanQuerybq)IndexSearchermysearch=LuceneSource();Sortsort=newSort(newSortField(ID,SortField.DOC,false);/排序returnmysearch.Search(bq,sort);Sort是对数据进行排序,比如这里对ID进行排序.注意,LUCENE不支持关键词为空的情况,所以如果你想把索引文件中所有的数据都调用出来,那可以用如下方法for(inti=0;imysearch.M

27、axDoc();i+)Documentdoc=mysearch.Doc(i);FillingTable(mytab,doc);5.把过滤后的数据并扔入Table数据源privatevoidFillingTable(DataTabledt,Documentdoc)DataRowmyrow;myrow=dt.NewRow();myrow0=doc.Get(id).ToString();myrow1=doc.Get(tradename).ToString();myrow2=doc.Get(areaname).ToString();myrow3=doc.Get(companyname).ToStrin

28、g();myrow4=doc.Get(fhdes).ToString();myrow5=doc.Get(productname).ToString();myrow6=doc.Get(pic).ToString();dt.Rows.Add(myrow);myrow.AcceptChanges();从Lucene中学到更多Luene的确是一个面对对象设计的典范(1)所有的问题都通过一个额外抽象层来方便以后的扩展和重用:你可以通过重新实现来达到自己的目的,而对其他模块而不需要;(2)简单的应用入口Searcher,Indexer,并调用底层一系列组件协同的完成搜索任务;(3)所有的对象的任务都非常专

29、一:比如搜索过程:QueryParser分析将查询语句转换成一系列的精确查询的组合(Query),通过底层的索引读取结构IndexReader进行索引的读取,并用相应的打分器给搜索结果进行打分/排序等。所有的功能模块原子化程度非常高,因此可以通过重新实现而不需要修改其他模块。(4)除了灵活的应用接口设计,Lucene还提供了一些适合大多数应用的语言分析器实现(SimpleAnalyser,StandardAnalyser),这也是新用户能够很快上手的重要原因之一。这些优点都是非常值得在以后的开发中学习借鉴的。作为一个通用工具包,Lunece的确给予了需要将全文检索功能嵌入到应用中的开发者很多的

30、便利。此外,通过对Lucene的学习和使用,我也更深刻地理解了为什么很多数据库优化设计中要求,比如:(1)尽可能对字段进行索引来提高查询速度,但过多的索引会对数据库表的更新操作变慢,而对结果过多的排序条件,实际上往往也是性能的杀手之一。(2)很多商业数据库对大批量的数据插入操作会提供一些优化参数,这个作用和索引器的merge_factor的作用是类似的,(3)20%/80%原则:查的结果多并不等于质量好,尤其对于返回结果集很大,如何优化这头几十条结果的质量往往才是最重要的。(4)尽可能让应用从数据库中获得比较小的结果集,因为即使对于大型数据库,对结果集的随机访问也是一个非常消耗资源的操作。参考文献1刘奕群,马少平。搜索引擎技术基础M.清华大学出版社.2010.072罗刚.解密搜索引擎技术实战:Lucene&Java精华版(第2版)M.电子工业出版社.2014.013耿祥义,张跃平.java程序设计实用教程M.人民邮电出版社.2012.064郭克华,李敏.javaWeb程序设计.清华大学出版社.2013.015李刚,宋伟,邱哲.征服Ajax+Lucene构建搜索引擎M.北京:人民邮电出版社.2006.5张校乾,金玉玲,侯丽波.一种基于Lucene检索引擎的全文数据库的研究与实现J.现代图书情报技术.2005.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁