全文检索lucene研究
- 格式:doc
- 大小:91.50 KB
- 文档页数:14
基于Lucene的全文检索系统的研究与实现的开题报告一、选题背景及意义随着互联网时代的到来,信息爆炸式增长已经成为人们必须面对的一个问题。
传统的基于关键字的检索方式已经不能满足人们的需求。
全文检索系统应运而生,它可以从大量的文本中快速准确地查找需要的信息,方便人们的使用。
Lucene是一个流行的全文检索引擎,它是基于Java语言开发的,使用Apache协议开源。
Lucene具有快速、可扩展和高效的特点,在应用领域有广泛的应用,如搜索引擎、电子商务网站、维基百科等。
然而,Lucene作为一个开源的库,仍需要使用者有一定的技术基础才能进行使用。
因此,本文将研究如何利用Lucene实现全文检索系统,并通过分析其架构和实现细节,深入了解全文检索系统的工作原理和技术方法。
二、研究内容1. 全文检索技术的概述2. Lucene的基本原理和架构3. 全文检索系统的需求分析4. Lucene全文检索系统的设计和实现5. 系统优化和性能测试三、预期成果完成本文研究所需的工作,预期可以达到以下成果:1. 掌握全文检索技术的基本原理和方法。
2. 深入了解Lucene的架构和实现细节,掌握Lucene的基本使用方法和技巧。
3. 实现一个基于Lucene的全文检索系统,包括需求分析、系统设计、编码实现、系统优化和性能测试等环节。
4. 对系统的性能进行测试和优化,提高系统的搜索效率和准确性。
四、研究方法1. 文献调研:通过阅读相关的学术论文和技术博客,了解全文检索技术的最新研究进展和应用情况。
2. 系统分析:对基于Lucene全文检索系统的需求进行分析和定位,明确系统的功能和性能要求。
3. 系统设计:根据需求分析,设计系统的架构和流程,确定系统各个模块之间的交互和约束关系。
4. 编码实现:使用Java语言编写全文检索系统,使用Lucene作为底层引擎,实现检索功能和系统界面。
5. 系统测试和优化:进行系统性能测试和故障测试,针对测试结果进行优化和改进。
基于Lucene全文检索系统的研究与实现[摘要] lucene是一个开放源代码的全文检索引擎工具包,利用它可以快速地开发一个全文检索系统。
利用lucene开发了一个全文检索系统,通过其特殊的索引结构,实现了传统数据库不擅长的全文索引机制,提供了对非结构化信息的检索能力。
[关键词] lucene 信息检索全文检索索引一、引言计算机技术及网络技术的迅速发展,使得internet成为人类有史以来资源最多、品种最全、规模最大的信息资源库。
如何在这海量的信息里面快速、全面、准确地查找所需要的资料信息已经成了人们关注的焦点,也成了研究领域内的一个热门课题。
这些信息基本上可以分做两类:结构化数据和非结构化数据(如文本文档、word 文档、pdf文档、html文档等)。
现有的数据库检索,是以结构化数据为检索的主要目标,实现相对简单。
但对于非结构化数据,即全文数据,由于复杂的数据事务操作以及低效的高层接口,导致检索效率低下。
随着人们对信息检索的要求也越来越高,而全文检索因为检索速度快、准确性高而日益受到广大用户的欢迎, lucene是一个用java写的全文检索引擎工具包,可以方便地嵌入到各种应用中实现针对应用的全文索引和检索功能。
这个开源项目的推出及发展,为任何应用提供了对非结构化信息的检索能力。
二、全文检索策略通常比较厚的书籍后面常常附关键词索引表(比如,北京:12,34页,上海:3,77页……),它能够帮助读者比较快地找到相关内容的页码。
而数据库索引能够大大提高查询的速度原理也是一样,由于数据库索引不是为全文索引设计的,因此,使用like “%keyword%”时,数据库索引是不起作用的,在使用like查询时,搜索过程又变成类似于一页页翻书的遍历过程了,所以对于含有模糊查询的数据库服务来说,like对性能的危害是极大的。
如果是需要对多个关键词进行模糊匹配:like“%keyword1%”and like “%keyword2%”……其效率也就可想而知了。
lucene实现全文搜索1.什么是全文搜索全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。
这个过程类似于通过字典中的检索字表查字的过程。
2.什么是luceneapache lucene是一个开放源程序的搜寻器引擎,利用它可以轻易地为Java软件加入全文搜寻功能。
lucene的最主要工作是替文件的每一个字作索引,索引让搜寻的效率比传统的逐字比较大大提高,lucene提供一组解读,过滤,分析文件,编排和使用索引的API,它的强大之处除了高效和简单外,是最重要的是使使用者可以随时应自已需要自订其功能。
lucene是apache软件基金会项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。
lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
3.特点及优势lucene作为一个全文检索引擎,其具有如下突出的优点:1、索引文件格式独立于应用平台。
lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
2、在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。
然后通过与原有索引的合并,达到优化的目的。
3、优秀的面向对象的系统架构,使得对于lucene扩展的学习难度降低,方便扩充新功能。
4、设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。
5、已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search[11])、分组查询等等。
lucene全文检索精华lucene全文检索1 概念全文检索(Full-Text Retrieval)是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置。
当用户查询时根据建立的索引查找,类似于通过字典的检索字表查字的过程.1.1 lucene全文检索的特性全文检索(Full-Text Retrieval)是指以文本作为检索对象,找出含有指定词汇的文本。
全面、准确和快速是衡量全文检索系统的关键指标。
关于全文检索的特性,我们要知道:1,只处理文本。
2,不处理语义。
3,搜索时英文不区分大小写。
4,结果列表有相关度排序。
下图就是显示“1+1等于几”这个搜索要求对应的结果。
可以看到,是没有“2”这个结果的,结果页面都是出现了这些词的网页 .1.2 全文检索的应用场景我们使用Lucene,主要是做站内搜索,即对一个系统内的资源进行搜索。
如BBS、BLOG中的文章搜索,网上商店中的商品搜索等。
使用Lucene的项目有Eclipse、Jira等。
一般不做互联网中资源的搜索,因为不易获取与管理海量资源(专业搜索方向的公司除外)。
2 第一个lunece程序2.1 准备lucene的开发环境搭建Lucene的开发环境只需要加入Lucene的Jar包,要加入的jar包至少要有: ? lucene-core-4.4.0.jar(核心包)? analysis\\common\\lucene-analyzers-common-4.4.0.jar(分词器) ?highlighter\\lucene-highlighter-4.4.0.jar(高亮) ? \\memory\\lucene-memory-4.4.0.jar(高亮)? queryparser\\ lucene-queryparser-4.4.0.jar (查询解析)2.2 实现建立索引功能(IndexWriter)/*** 使用indexWriter对数据库建立索引.. * @throws IOException */ @Test public void createIndex() throws IOException{//索引存放的位置...Directory directory=FSDirectory.open(new File(\));//lucene当前使用的匹配版本Version matchVersion=Version.LUCENE_44;//分词器,对文本进行分词,抽象类,由子类实现不同的分词方式Analyzer analyzer=new StandardAnalyzer(matchVersion); //索引写入的配置 IndexWriterConfig indexWriterConfig=new//构建用于操作索引的类IndexWriter indexWriter=new IndexWriter(directory,IndexWriterConfig(matchVersion, analyzer);indexWriterConfig);//索引库里面的要遵守一定的结构,(索引结构...) 在索引库当中保存的都是documentDocument doc=new Document(); //索引document里面页游很多的字段... /** * 1:字段的名称 * 2:字段对应的值* 3:该字段在索引库中是否存储 */IndexableField id=new IntField(\, 1, Store.YES);//StringField不会根据分词器去拆分,只有后面的String全包括才能被搜索到IndexableField title=new StringField(\, \培训,传智播客//TextField如果按照默认分词器去拆分,中文则是按照单个中文拆分的专注Java培训10年\, Store.YES);IndexableField content=new TextField(\, \培训的龙头老大,口碑最好的java培训机构,进来看看同学们的呐喊\, Store.YES);doc.add(id);}doc.add(title); doc.add(content);indexWriter.addDocument(doc);indexWriter.close();2.3 实现搜索功能(IndexSearcher)/*** 使用indexSearcher对数据进行搜索 * @throws IOException */ @Testpublic void queryIndex() throws IOException{//索引存放的位置Directory directory=FSDirectory.open(new File(\)); //创建索引读取器IndexReader indexReader=DirectoryReader.open(directory);//通过indexSearcher去检索索引目录...IndexSearcher indexSearcher=new IndexSearcher(indexReader);//我们以后只要根据索引查找,整个过程肯定要分2次..//这是一个搜索条件..,通过定义条件来进行查找...(可以拿到编号,编号都放在了//term 我需要根据哪个字段进行检索,字段对应的值...//Query是抽象类,由子类去实现不同的查询规则Query query=new TermQuery(new Term(\, \));//搜索先搜索索引目录(第一次搜)..不会直接搜索到document(第二次搜) //找到符合query条件的前面N条记录...如果不加条件则会全部查询出来ScoreDoc数组中,遍历数组就获得了编号)TopDocs topDocs=indexSearcher.search(query, 10); System.out.println(\总记录数是:\+topDocs.totalHits);//返回结果的数组(得分文档)ScoreDoc[] scoreDocs=topDocs.scoreDocs; //返回一个击中..for(ScoreDoc scoreDoc:scoreDocs){int docID=scoreDoc.doc; //根据编号去击中对应的文档//lucene的索引库里有很多document,lucene为每个document定义一个编号,唯一标识(docId),是自增长的。
基于Lucene的电子文献全文检索系统的研究【摘要】:实现了中文单字切分模块,并在LuceneAPI基础上建立支持中英文混合检索的全文数据库。
在电子文献全文检索系统项目中作为全文检索工具。
中文全文数据库的主要性能和功能包括:支持中英文混合检索;可以不关机动态添加或删除一篇文档索引;采用多线程设计,能承受大量的访问请求;支持跨平台运行;提供命令行直接查询方式和基于WEB的查询方式;易学通用的检索表达式;系统可扩展性强。
【关键词】:中文信息处理;全文数据库;全文检索Lucene中国分类号:TP3 文献标识码:A 文章编号:1002-6908(2007)0220078-011.Lucene简介Lucene是一个信息检索的函数库(Library),利用它你可以为你的应用加上索引和搜索的功能。
Lucene的使用者不需要深入了解有关全文检索的知识,仅仅学会使用库中的一个类,你就为你的应用实现全文检索的功能。
Lucene可以对任何的数据做索引和搜索,不管是MS word、Html 、pdf还是其他什么形式的文件只要你可以从中抽取出文字形式的内容就可以被Lucene所用,你就可以用Lucene对它们进行索引以及搜索。
它不仅能用来构建具体的全文检索应用,而且可被集成到各种系统软件中构建Web 等多种应用。
例如,某些商业软件也采用了Lucene作为其内部全文检索子系统的核心。
2.Lucene检索原理Lucene的检索算法属于索引检索,即用空间来换取时间,对需要检索的文件、字符流进行全文索引,在检索的时候对索引进行快速的检索,得到检索位置,这个位置记录检索词出现的文件路径或者某个关键词。
在使用数据库的项目中,一般不使用数据库进行检索,其主要原因是数据库在非精确查询的时候使用查询语言”like%keyword%”,对数据库进行查询是对所有记录遍历,并对字段进行”%keyword%”匹配,在数据库的数据庞大以及某个字段存储的数据量庞大的时候,这种遍历是低效的,它需要对所有的记录进行匹配查询。
本文由美白面膜排行榜整理全文检索lucene研究1 Lucene简介Lucene是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。
Lucene以其方便使用、快速实施以及灵活性受到广泛的关注。
它可以方便地嵌入到各种应用中实现针对应用的全文索引、检索功能,本总结使用lucene3.0.02 Lucene 的包结构1、analysis对需要建立索引的文本进行分词、过滤等操作2、standard是标准分析器3、document提供对Document和Field的各种操作的支持。
4、index是最重要的包,用于向Lucene提供建立索引时各种操作的支持5、queryParser提供检索时的分析支持6、search负责检索7、store提供对索引存储的支持8、util提供一些常用工具类和常量类的支持Lucene中的类主要组成如下:1)org.apache.1ucene.analysis语言分析器,主要用于的切词Analyzer是一个抽象类,管理对文本内容的切分词规则。
2)org.apache.1uceene.document索引存储时的文档结构管理,类似于关系型数据库的表结构。
3)document包相对而言比较简单,document相对于关系型数据库的记录对象,Field主要负责字段的管理。
4)org.apache.1ucene.index索引管理,包括索引建立、删除等。
索引包是整个系统核心,全文检索的根本就是为每个切出来的词建索引,查询时就只需要遍历索引,而不需要去正文中遍历,从而极大的提高检索效率。
5)org.apache.1ucene.queryParser查询分析器,实现查询关键词间的运算,如与、或、非等。
6)org.apache.1ucene.search检索管理,根据查询条件,检索得到结果。
7)org.apache.1ucene.store数据存储管理,主要包括一些底层的I/0操作。
8)org.apache.1ucene.util一些公用类。
3 Document文档1)void add(Field field) 往Document对象中添加字段2)void removeField(String name)删除字段。
若多个字段以同一个字段名存在,则删除首先添加的字段;若不存在,则Document保持不变3)void removeFields(String name)删除所有字段。
若字段不存在,则Document保持不变4)Field getField(String name)若多个字段以同一个字段名存在,则返回首先添加的字段;若字段不存在,则Document保持不变5)Enumeration fields()返回Document对象的所有字段,以枚举类型返回6)Field [] getFields(String name)根据名称得到一个Field的数组7)String [] getValues(String name)根据名称得到一个Field的值的数组Document doc1 = new Document();doc1.add(new Field("name", "word1 word2word3",Field.Store.NO,Field.Index.TOKENIZED));Document doc2 = new Document();doc2.add(new Field("name", "word1 word2word3",Field.Store.NO,Field.Index.TOKENIZED));4 Field字段以new Field("name", "word1 word2word3",Field.Store.YES,Field.Index.TOKENIZED);为例4.1 Field类的构造方法public Field(String name,String value,Store store,Index index);//直接的字符串方式public Field(String name,String value,Store store,Indexindex,TermVector termVector);public Field(String name,String value,Reader reader);//使用Reader 从外部传入public Field(String name,String value,Reader reader,TermVector termVector);public Field(String name,byte[] value,Store store)//使用直接的二进制byte传入当Field值为二进制时,可以使用Lucene的压缩功能将其值进行压缩。
4.2 store类Store.NO:表示该Field不需要存储Store.YES:表示该Field需要存储PRESS:表示用压缩方式来保存这个Field的值4.3 ind ex类Index.NO:不需要索引Index. ANALYZED: 分词索引:会对Field的内容进行分词,只要部分词匹配该Field会被选中;Index. NOT_ANALYZED: 不分词索引:不会对Field的内容进行分词,只有全词匹配该Field才会被选中;5 IndexWriter类5.1 Ind exWriter类的构造方法public IndexWriter(Directory d,Analyzer a,Boolean create,MaxFieldLength length)public IndexWriter(Directory d,Analyzer a, MaxFieldLength mfl)IndexWriter writer=new IndexWriter(new SimpleFSDirectory(newFile(path)),new StandardAnalyzer(),true,IndexWriter.MaxFieldLength.LIMITED);第一个参数:索引存放在什么地方第二个参数:文本分析器,继承自org.apache.lucene.analysis.Analyzer 类第三个参数:是否创建新索引,为true时,IndexWriter不管目录内是否已经有索引了,一律清空,重新建立;当为false时,则IndexWriter会在原有基础上增量添加索引。
所以在更新的过程中,需要设置该值为false。
第四个参数:最大field数量5.2 添加文档public void addDocument(Document doc)public void addDocument(Document doc,Analyzer analyzer)//使用一个开发者自定义的,而非事先在构建IndexWriter时声明的Analyzer来进行分析writer.addDocument(doc1);writer.addDocument(doc2);Sytem.out.println(writer.docCount());writer.close();IndexSearcher searcher = new IndexSearcher(path);Hits hits = null;Query query = null;QueryParser parser =new QueryParser("name", new StandardAnalyzer());query =parser.parse("word1");hits = searcher.search(query);System.out.println("查找 word1 共" + hits.length() + "个结果"); 5.3 删除文档IndexWriter提供四个方法删除DocumentdeleteDocuments(Term);deleteDocuments(Term[]);deleteDocuments(Query);deleteDocuments(Query[]);Term是个final的类,所以它没有任何子类//删除filename为time.txt的文档writer.deleteDocuments(new Term("filename","time.txt"));Query是个抽象类,继承于它的MultiTermQuery类也是个抽象类,而TermRangeQuery类又继承于MultiTermQuery,并且实现其所有抽象方法,所以删除文档也可以用下面这种方式:writer.deleteDocuments(newTermRangeQuery(“title”,”d”,”j”,true,true));//两个true、true分别代表了是否包含d j两点。
因为RangeQuery已经不推荐再使用,而是用TermRangeQuery和NumericRangeQuery来替代,NumericRangeQuery与RangeQuery类似,只不过是对数值进行范围检索。
5.4 更新文档更新索引提供两个方法,其实Lucene是没有办法更新的,只有先删除了再更新,方法如下updateDocument(Term, Document)首先删除所有的文档,然后用默认的文本分析器加上新的文档updateDocument(Term, Document, Analyzer)//同样是先删除所有文档,不再使用默认的分析器,使用提供的分析器加上文档5.5 性能参数1)megeFactor控制Lucene在把索引从内存写入磁盘上的文件系统时内存中最大的Document数量,同时它还控制内存中最大的Segment数量。
默认为10.writer.setMergeFactor(10);2) maxMergeDocs限制一个Segment中最大的文档数量。
writer.setMaxMergeDocs(1000);一个较大的maxMergeDocs适用于对大批量的文档建立索引,增量式的索引则应使用较小的maxMergeDocs。
3) minMergeDocs用于控制内存中持有的文档数量的,它对磁盘上的Segment大小没有任何影响。
4) maxFieldLength限制Field的长度,默认值为10000.最大值100000个。