lucene全文检索.ppt

上传人:牧羊曲112 文档编号:5438578 上传时间:2023-07-07 格式:PPT 页数:45 大小:613.50KB
返回 下载 相关 举报
lucene全文检索.ppt_第1页
第1页 / 共45页
lucene全文检索.ppt_第2页
第2页 / 共45页
lucene全文检索.ppt_第3页
第3页 / 共45页
lucene全文检索.ppt_第4页
第4页 / 共45页
lucene全文检索.ppt_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《lucene全文检索.ppt》由会员分享,可在线阅读,更多相关《lucene全文检索.ppt(45页珍藏版)》请在三一办公上搜索。

1、Lucene全文检索,总体内容,第一章:lucene简介第二章:入门实例第三章:分析器Analyzer项目实践:构建一个简单的WEB搜索程序,第一章:Lucene简介,搜索引擎的历史什么是Lucene全文检索系统的结构为什么使用LuceneLucene倒排索引原理Lucene只关注文本的索引和搜索Nutch,搜索引擎的历史,萌芽:Archie、Gopher起步:Robot(网络机器人)的出现与Spider(网络爬虫)发展:Excite、Galaxy、Yahoo等繁荣:Infoseek、AltaVista、Google和Baidu,什么是Lucene,Lucene是非常优秀的成熟的开源的免费的纯

2、java语言的全文索引检索工具包。全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。Lucene是一个高性能、可伸缩的信息搜索(IR)库。Information Retrieval(IR)library.它使你可以为你的应用程序添加索引和搜索能力。Lucene的作者Doug Cutting是资深的全文索引/检索专家,最开始发布在他本人的主页上,2001年10月贡献给APACHE,成为APACHE基金的一个子项目。,全文检索系统的结构,为什么使用Lu

3、cene,Lucene作为一个全文检索引擎,其具有如下突出的优点:(1)索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。(2)在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。(3)优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。(4)设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。(5)已

4、经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search)、分组查询等等。开源,可扩展能力强,有各种语言版本,适合各种平台,Lucene倒排索引原理,假设有两篇文章1和2 文章1的内容为:TomlivesinGuangzhou,IliveinGuangzhoutoo.文章2的内容为:HeoncelivedinShanghai.经过分词处理后 文章1的所有关键词为:tomliveguangzhouiliveguangzhou 文章2的所有关键词为:heliveshanghai 加上“出现频率”

5、和“出现位置”信息后,我们的索引结构为:,Lucene只关注文本的索引和搜索,lucene建立索引的来源,Nutch,我们来大概了解一下Nutch,以及你将在哪方面运用它?我还是先说一下Lucene吧。Lucene其实是一个提供全文文本搜索的函数库,它不是一个应用软件。它提供很多API函数让你可以运用到各种实际应用程序中。现在,它已经成为Apache的一个项目并被广泛应用着。这里列出一些已经使用Lucene的系统。Nutch 是一个建立在Lucene核心之上的Web搜索的实现,它是一个真正的应用程序。也就是说,你可以直接下载下来拿过来用。它在Lucene的基础上加了网 络爬虫和一些和Web相关

6、的东东。其目的就是想从一个简单的站内索引和搜索推广到全球网络的搜索上,就像Google和Yahoo一样。当然,和那些巨人 竞争,你得动一些脑筋,想一些办法。我们已经测试过100M的网页,并且它的设计用在超过1B的网页上应该没有问题。当然,让它运行在一台机器上,搜索一 些服务器,也运行的很好。百度爬虫遐想,第二章:入门实例,Lucene的主要逻辑图创建索引索引查询帮助文档理解核心索引类理解核心搜索类更新索引中的Document,Lucene的主要逻辑图,Lucene功能强大,但从根本上说,主要包括两块:一是文本内容经切词后索引入库;二是根据查询条件返回结果,创建索引,Directory inde

7、xDir=FSDirectory.open(new File(INDEXDIR);IndexWriter writer=new IndexWriter(indexDir,analyzer,true,MaxFieldLength.LIMITED);/2-索引目标File file=new File(FILENAME);/3-规定索引范围,目标写入Document doc=new Document();doc.add(new Field(name,file.getName(),Store.YES,Index.ANALYZED);doc.add(new Field(content,IOUtils.r

8、eadFileContent(file),Store.YES,Index.ANALYZED);doc.add(new Field(size,NumericUtils.longToPrefixCoded(file.length(),Store.YES,Index.NOT_ANALYZED);doc.add(new Field(path,file.getAbsolutePath(),Store.YES,Index.NOT_ANALYZED);writer.addDocument(doc);writer.optimize();/5-生成索引writer.close();,索引查询,/1-划定检索范围

9、String fields=new String name,content;QueryParser qp=new QueryParser(Version.LUCENE_36,fields,analyzer);/2-检索关键字String key=泽元软件;Query query=qp.parse(key);/3-检索结果Directory indexDir=FSDirectory.open(new File(INDEXDIR);Searcher searcher=new IndexSearcher(indexDir,true);TopDocs topDocs=searcher.search(q

10、uery,100);,帮助文档,入库逻辑,入 库者定义到库中文档的结构,比如需要把网站内容加载到全文检索库,让用户通过“站内检索”搜索到相关的网页内容。入库文档结构与关系型数据库中的表结构类 似,每个入库的文档由多个字段构成,假设这里需要入库的网站内容包括如下字段:文章标题、作者、发布时间、原文链接、正文内容(一般作为网页快照)。包含N个字段的文档(DOCUMENT)在真正入库前需要经过切词(或分词)索引,切词的规则由语言分析器(ANALYZER)完成。切分后的“单词”被注册到索引树上,供查询时用,另外也需要把其它不需要索引的内容入库,所有这些是文件操作均由STORAGE完成。Lucene的索

11、引树结构非常优秀,是Lucene的一大特色。,查询逻辑,查询者输入查询条件,条件之间可以通过特定运算符进行运算,比如查询希望查询到与“中国”和“北京”相关的记录,但不希望结果中包括“海淀区中关村”,于是输入条件为“中国+北京-海淀区中关村”;查询条件被传达到查询分析器中,分析器将将对“中国+北京-海 淀区中关村”进行分析,首先分析器解析字符串的连接符,即这里的加号和减号,然后对每个词进行切词,一般最小的词元是两个汉字,则中国和北京两个词不必再 切分,但对海淀区中关村需要切分,假设根据切词算法,把该词切分为“海淀区”和“中关村”两部分,则最后得到的查询条件可以表示为:“中国”AND“北京”AND

12、 NOT(“海淀区”AND“中关村”)。查询器根据这个条件遍历索引树,得到查询结果,并返回结果集,返回的结果集类似于JDBC中的ResultSet。将返回的结果集显示在查询结果页面,当点击某一条内容时,可以链接到原始网页,也可以打开全文检索库中存储的网页内容。这就是查询的逻辑过程,需要说明的是,Lucene默认只支持英文,为了便于说明问题,以上查询过程采用中文举例,事实上,当Lucene被扩充支持中文后就是这么一个查询过程。,理解核心索引类,为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter public abstract class Dir

13、ectory public abstract class Analyzer public final class Document public final class Field,IndexWriter,IndexWriter是在索引过程中的中心组件。IndexWriter这个类创建一个新的索引并且添加文档到一个已有的索引中。你可以把IndexWriter想象成让你可以对索引进行写操作的对象,但是不能让你读取或搜索。IndexWriter不是唯一的用来修改索引的类org.apache.lucene.index.IndexWriter public IndexWriter(Stringpath

14、,Analyzera,booleancreate)Parameters:path-the path to the index directorya-the analyzer to usecreate-true to create the index or overwrite the existing one;false to append to the existing index,String index=C:tomcatwebappsindex1;IndexWriter writer=new IndexWriter(index,new StandardAnalyzer(),true);,D

15、irectory,Directory类代表一个Lucene索引的位置。它是一个抽象类.其中的两个实现:第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。在我们的Indexer示例中,我们使用一个实际文件系统目录的路径传递给IndexWriter的构造函数来获得Directory的一个实例。IndexWriter然后使用Directory的一个具体实现FSDirectory,并在文件系统的一个目录中创建索引。,Analyzer,在一个文档被索引之前,首先需要对文档内容进行分词处理,并且而剔除一些冗余

16、的词句(例如:a,the,they等),这部分工作就是由 Analyzer 来做的。Analyzer 类是一个抽象类,它有多个实现。BrazilianAnalyzer,ChineseAnalyzer,CJKAnalyzer,CzechAnalyzer,DutchAnalyzer,FrenchAnalyzer,GermanAnalyzer,GreekAnalyzer,KeywordAnalyzer,PatternAnalyzer,PerFieldAnalyzerWrapper,RussianAnalyzer,SimpleAnalyzer,SnowballAnalyzer,StandardAnal

17、yzer,StopAnalyzer,ThaiAnalyzer,WhitespaceAnalyzer针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。,Document,Document文档类似数据库中的一条记录,可以由好几个字段(Field)组成,并且字段可以套用不同的类型。一个Field代表与这个文档相关的元数据。元数据如作者、标题、主题、修改日期等等,分别做为文档的字段索引和存储。Document的方法:void add(Fieldablefield)添加一个字段(Field)到Document中String g

18、et(String name)从文档中获得一个字段对应的文本,doc.add(new Field(path,f.getPath(),Field.Store.YES,Field.Index.UN_TOKENIZED);,Field,Field 对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个 Field 对象分别描述。Field(Stringname,bytevalue,Field.Storestore)Create a stored field with binary value.Field(Stringname,Readerreader)Create a token

19、ized and indexed field that is not stored.Field(Stringname,Readerreader,Field.TermVectortermVector)Create a tokenized and indexed field that is not stored,optionally with storing term vectors.Field(Stringname,Stringvalue,Field.Storestore,Field.Indexindex)Create a field by specifying its name,value a

20、nd how it will be saved in the index.Field(Stringname,Stringvalue,Field.Storestore,Field.Indexindex,Field.TermVectortermVector)Create a field by specifying its name,value and how it will be saved in the index.Field(Stringname,TokenStreamtokenStream)Create a tokenized and indexed field that is not st

21、ored.Field(Stringname,TokenStreamtokenStream,Field.TermVectortermVector)Create a tokenized and indexed field that is not stored,optionally with storing term vectors.,静态内部类,Field.Index 表示Field的索引方式NO 表示该Field不需要索引,也就是用户不需要去查找该Field的值NO_NORMS 表示对该Field进行索引,但是不使用Analyzer,同时禁止它参加评分,主要是为了减少内存的消耗TOKENIZED

22、 表示该Field先被分词再索引UN_TOKENIZED 像链接地址URL、文件系统路径信息、时间日期、人名、居民身份证、电话号码等等通常将被索引并且完整的存储在索引中,但一般不需要切分词Field.Store 表示Field的存储方式COMPRESS压缩存储 NO 原文不存储在索引文件中,搜索结果命中后,再根据其他附加属性如文件的Path,数据库的主键等,重新连接打开原文,适合原文内容较大的情况。YES索引文件本来只存储索引数据,此设计将原文内容直接也存储在索引文件中,如文档的标题。,理解核心搜索类,只需要几个类来执行基本的搜索操作:public class IndexSearcher ex

23、tends Searcher public final class Term public abstract class Query public class TermQuery extends Query public final class Hits,IndexSearcher,IndexSearcher是用来在建立好的索引上进行搜索的 它只能以只读的方式打开一个索引,所以可以有多个IndexSearcher的实例在一个索引上进行操作。它提供几个搜索方法,其中一些在抽象基类Searcher中实现;,Search方法,返回值为Hits型的对象:public final Hits search

24、(Queryquery)throws IOException Returns the documents matching query.public Hits search(Queryquery,Filterfilter)throws IOException Returns the documents matching query and filter.public Hits search(Queryquery,Sortsort)throws IOException Returns documents matching query sorted by sort.public Hits sear

25、ch(Queryquery,Filterfilter,Sortsort)throws IOException Returns documents matching query and filter,sorted by sort.,Term,Term是搜索的基本单元。一个Term对象有两个String类型的域组成:字段的名称和字段的值。在搜索时,你可能创建Term对象并和TermQuery同时使用。其中第一个参数代表了要在文档的哪一个Field上进行查找,第二个参数代表了要查询的关键词。Query q=new TermQuery(new Term(“fieldName”,“queryWord”)

26、;Hits hits=sercher.search(q);这段代码使Lucene找出在fieldName字段中含有单词queryWord的所有文档。因为TermQuery对象继承自它的抽象父类Query,你可以在等式的左边用Query类型。,Query,Query是一个抽象类,这个类的目的是把用户输入的查询字符串封装成Lucene能够识别的Query。Lucene中包含一些Query的具体子类。Direct Known Subclasses:BooleanQuery,BoostingQuery,ConstantScoreQuery,ConstantScoreRangeQuery,CustomS

27、coreQuery,DisjunctionMaxQuery,FilteredQuery,FuzzyLikeThisQuery,MatchAllDocsQuery,MoreLikeThisQuery,MultiPhraseQuery,MultiTermQuery,PhraseQuery,PrefixQuery,RangeQuery,SpanQuery,TermQuery,ValueSourceQuery,Hits,Hits是用来保存搜索的结果的。基于性能考虑,Hits的实例并不从索引中加载所有匹配查询的所有文档,而是每次一小部分。public final int length()public f

28、inal Document doc(intn)public final float score(intn)public final int id(intn)public Iterator iterator(),BooleanQuery布尔搜索,BooleanQuery是实际开发过程中经常使用的一种Query。它其实是一个组合的Query,在使用时可以把各种Query对象添加进去并标明它们之间的逻辑关系。BooleanQuery是可以嵌套的(BooleanQuery是一个布尔子句的容器)一个BooleanQuery可以成为另一个BooleanQuery的条件子句。布尔型Query的子句数目不能超

29、过1024。,BooleanClause布尔搜索,public void add(Queryquery,BooleanClause.Occuroccur)BooleanClause用于表示布尔查询子句关系的类,包括:,。有以下6种组合:1MUST和MUST:取得连个查询子句的交集。2MUST和MUST_NOT:表示查询结果中不能包含MUST_NOT所对应得查询子句的检索结果。3MUST_NOT和MUST_NOT:无意义,检索无结果。4SHOULD与MUST、SHOULD与MUST_NOT:SHOULD与MUST连用时,无意义,结果为MUST子句的检索结果。SHOULD与MUST_NOT连用时,

30、SHOULD功能同MUST,相当于MUST和MUST NOT的检索结果。5SHOULD与SHOULD:表示“或”关系,最终检索结果为所有检索子句的并集。,RangeQuery范围搜索,public RangeQuery(TermlowerTerm,TermupperTerm,booleaninclusive)布尔型的参数表示是否将2个临界值也加入到搜索中查找所有书号在000001到000005之间的图书,并且不包括000001和000005IndexSearcher searcher=new IndexSearcher(PATH);Term begin=new Term(booknumber,

31、000001);Term end=new Term(booknumber,000005);RangeQuery query=new RangeQuery(begin,end,false);Hits hits=searcher.search(query);,搜索类型,PrefixQuery 前缀搜索PhraseQuery短语搜索FuzzyQuery模糊搜索WildcardQuery通配符搜索SpanQuery跨度搜索_RegexQuery正则表达式搜索,更新索引中的Document,“如何才能更新索引中的文档?”是一个在Lucene用户邮件列表中经常问的问题。Lucene并没有提供更新方法;Do

32、cument必须首先从索引中删除然后再重新添加它如果你需要删除和添加多个Document,最好是进行批操作。按以下步骤:1.打开IndexReader。2.删除所有你要删除的Document。3.关闭IndexReader。4.打开IndexWriter。5.添加你要添加的所有Document。6.关闭IndexWriter。,第三章:分析器Analyzer,为什么要分词分词的种类最大正向匹配法中文分词的挑战常用的中文分词器,为什么要分词?,词是最小的能够独立活动的有意义的语言成分,英文单词之间是以空格作为自然分界符的,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,因此,中文词语分

33、析是中文信息处理的基础与关键。如果不使用中文分词,可以采用单个汉字索引方式。例如,雅虎,先索引 雅字,然后再索引虎字。同样,对于一篇文章,先把所有的汉字都单独索引一次,并记录他们的位置。搜索过程中,也是先找雅字的所有文档,再找虎字的所有文档,然后做交叉与运算,即包含这两个字,而且位置连续的文档才会做为符合要求的结果。这种方式是最基本的索引方式,现在有些小引擎中还在使用。但这里存在一个很有挑战性的问题:总共的常用汉字才3000多个,我们每次查询过程中,进行与操作的计算量会相当大,对于大数据量搜索引擎来说(超过10亿的文档),每天上亿次查询,这样的索引结构,无疑是对硬件和算法的极大挑战。,中文分词

34、方法,我们讨论的分词算法一般可分为三大类:1.基于字典、词库匹配的分词方法;2.基于词频度统计的分词方法;3.基于知识理解的分词方法。,基于词典的分词方法,也叫“机械分词法”,将分词的句子与词典中的词语进行匹配,如果匹配成功,则将匹配的部分作为一个词,最后生成一个词语序列,根据分词的方向与优先长度不同可分为一下四种方法:1、正向匹配法 例如:大学生活动中心2、逆向匹配法3、最大匹配法4、最小匹配法,最大正向匹配法,正向最大长度匹配切分过程表:,最后分词结果为大学生/活动/中心。,当然最大正向匹配也有弊端,例如:南京市长江大桥我们想要的匹配结果肯定是:南京市/长江/大桥但是按照最大正向匹配却是:

35、南京市长/江/大桥,中文分词的挑战,现代分词技术主要的挑战是:新词发现词典中没有的,但是结合紧密的字或词有可能组成一个新词。比如:“水立方”如果不在词典中,可能会切分成两个词“水”和“立方”。如果在一篇文档中“水”和“立方”结合紧密,则“水立方”可能是一个新词。可以用信息熵来度量两个词的结合紧密程度。,中文分词的挑战,新词语有些具有普遍意义的构词规则,例如“模仿秀”由“动词+名词”组成。统计的方法和规则的方法结合对每个文档中重复子串组成的候选新词打分,超过阈值的候选新词选定为新词。此外,可以用Web信息挖掘的方法辅助发现新词:网页锚点上的文字可能是新词,例如“美甲”。另外,可以考虑先对文档集合聚类,然后从聚合出来的相关文档中挖掘新词。还有一些新机构名、品牌名、专业名词、缩略语、网络新词、人名等,常用的中文分词器,单字分词二分法CJKAnalyzer词典分词中科院ICTCLAS,C+开发(JNI)JE分词,由java写成盘古分词,构建一个简单的WEB搜索程序,有兴趣的同学可以自己开发一个简单的搜索程序大家一起相互交流,thank you,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号