Lucene2.4_正在整理中.doc_第1页
Lucene2.4_正在整理中.doc_第2页
Lucene2.4_正在整理中.doc_第3页
Lucene2.4_正在整理中.doc_第4页
Lucene2.4_正在整理中.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

0. 作用(目标):学完后能做什么把最想要的资源快速的检索出来。全文检索不同于数据库全文检索和数据库的对比:他们所解决的问题不一样,解决的方案也不一样,所以不应进行对比。搜索:1,匹配效果:如搜索ant会搜索出planting。2,查出的结果没有相关度排序,不知道有用的结果在哪一页。3,搜索速度达不到毫秒级的要求。相关度排序说明:搜索结果列表中越靠前的,一般就是最符合我们所预期的结果。回想使用baidu的时候,一般在第1页中就可以找到想要的文章,越往后翻就越离题。这是因为结果列表是按照相关度排过序的。全文检索的实例有常见的搜索引擎baidu与google等。如下图就是使用baidu搜索的效果:我们主要是做系统内搜索(或叫做站内搜索),即对一个系统内的资源进行搜索。如BBS、Blog中的文章搜索,网上商店中的商品搜索等。实例有ItcastBBS、Eclipse等。一般不做互联网中资源的搜索,因为不易获取与管理海量资源。(专业搜索方向的公司除外)。学完后,可以为自已的系统增加全文检索的能力。练习:1,看明白ItcastTieba的实现。2,为他增加文章全文检索的功能。1. 基础概念说明全文检索 ORMLucene Hibernate要选明白概念,再学习相应实现(框架)。1.1. 全文检索的定义信息检索:从信息集合中找出与用户需求相关的信息。信息类型有:1,文本(或可以转为文本),如txt, html, pdf, word等。2,多媒体,如音频、视频、图片等。全文检索:是指把用户的查询请求要查询的一段文本和全文文体数据中的每一个词提取出文本中的词进行比较,不考虑查询请求与文本语义上的匹配。全文检索特点:1,只关注文本。2,不考虑语义。(如搜索“中国的首都是哪里”,如下图所示)在信息检索工具方式中,全文检索是最具通用性和实用性的。1.2. 全文检索的工作流程(并引出索引库)如果信息检索系统在用户发出了检索请求后再去互联网上找答案,根本无法在有限的时间返回结果。他是先索引,再搜索的。1, 索引流程。2, 搜索流程。搜索的目的是为了在大量的信息中发现自己感兴趣的信息。但是,当有了足够的资料(比如网页、Word文档、Pdf文档,或数据库中的资料等)之后,并不能立即开始搜索,在此之前,必须先对信息建立索引。就好比在图书馆里存放着大量书籍,当我们想查找关于某个主题的书籍时,不能一本一本的翻阅,而是要先查阅书籍的索引卡,根据索引卡上的信息找到相应的书籍。所以,当一本书进入到图书馆后,最重要的工作就是要马上建立索引卡。同样,对于我们所拥用的信息,也需要为其建立索引。建立索引,就是对待搜索的信息进行一定的分析,并将分析结果按照一定的组织方式存储起来,通常将这些结果存储在文件中。存储分析结果的文件的集合就是索引。在查询时,先从索引中查找,由于索引是按照一定的结构组织的,所以查询的速度非常快。索引库.html.txt.doc.pdf加工/分析建立索引采集分析建立索引的过程用户搜索的过程输入要搜索文本说明:在Internet上采集信息的软件被称为爬虫或蜘蛛,或称做网络机器人。爬虫在Internet上访问每一个网页,每访问一个网页就把其中的内容传回本地服务器。信息加工最主要的任务就是为采集到本地的信息编排索引,为查询做好准备。就好比在传统的图书编目工作中,图书管理员需要对书籍进行分类、标引、并撰写摘要。信息加工的过程的过程和图书编目过程类似,但全部由计算机自动完成。1.3. 实现快速检索的原理(索引库结构)1.3.1. 索引文件结构是倒排索引,索引对象是文档中的单词等,用来存储这些单词在一个文档中的位置。例如,有些书在最后提供的索引(单词页码 的对应列表),就可以看成是一种倒排序索引。可以通过一些关键字,在全书中检索出与之相关的部分。文档集合文档1文档2文档3文档4文档5 词汇表关键词所在的文档编号采集1,3信息1,5软件1,2,5 以上只是用于说明倒排序索引的结构,最终的索引结构要复杂的多,还要存储关键词在文本中的编号位置(或是首字母的字符位置)等信息。1.3.2. 索引文件的检索与维护词汇表规模相对较小,文档集合规模较大。进行检索时,先从检索词汇表开始,然后找到相对应的文档。如果查询中仅包含一个关键词,则在词汇表中找到该单词,并取出他对应的文档就可以了。如果查询中包含多个关键词,则需要将各个单词检索出的记录进行合并。维护倒排索引有三个操作:插入、删除和更新文档。但是更新操作需要较高的代价。因为文档修改后(即使是很小的修改),就可能会造成文档中的很多的关键词的位置都发生了变化,这就需要频繁的读取和修改记录,这种代价是相当高的。因此,一般不进行(真正的)更新操作,而是使用“先删除,后创建”的方式代替更新操作。2. HelloWorld发Lucene的资料,jar包等。2.1. Lucene介绍Lucene的主页为:/。有很多应用程序使用Lucene来提供全文检索的功能/jakarta-lucene/PoweredBy,如我们经常使用的Eclipse的帮助子系统,就是使用Lucene实现的。(在第一次使用的时候,会有一个进度条,那是在创建索引)。2.2. Lucene使用的HelloWorldHelloWorld程序有两个操作:创建索引与进行搜索。2.2.1. 添加Lucene环境l 添加jar包 n lucene-core-2.4.0.jar(核心);n contrib/analyzers/lucene-analyzers-2.4.0.jar(分词器);n contrib/highlighter/lucene-highlighter-2.4.0.jar(高亮器);2.2.2. 建立索引/* 创建索引*/Testpublic void createIndex() throws Exception / file - docDocument doc = File2DocumentUtils.file2Document(filePath);/ 建立索引IndexWriter indexWriter = new IndexWriter(indexPath, analyzer, true, MaxFieldLength.LIMITED);indexWriter.addDocument(doc);indexWriter.close();2.2.3. 进行搜索/* 搜索 */Testpublic void search() throws Exception String queryString = document;/ 1,把要搜索的文本解析为 QueryString fields = name, content ;QueryParser queryParser = new MultiFieldQueryParser(fields, analyzer);Query query = queryParser.parse(queryString);/ 2,进行查询IndexSearcher indexSearcher = new IndexSearcher(indexPath);Filter filter = null;TopDocs topDocs = indexSearcher.search(query, filter, 10000);System.out.println(总共有【+topDocs.totalHits+】条匹配结果);/ 3,打印结果for(ScoreDoc scoreDoc : topDocs.scoreDocs)int docSn = scoreDoc.doc; / 文档内部编号Document doc = indexSearcher.doc(docSn); / 根据编号取出相应的文档File2DocumentUtils.printDocumentInfo(doc); / 打印出文档信息练习:使用Lucene进行索引与搜索,完成建立索引与搜索的两个方法。1.1. 小结3. 基础的和重要的类与方法IndexWriter:操作索引库,增删改/ 构造方法:如果索引库不存在,会自动创建。如果存在,就使用他new IndexWriter(String/Directory indexPath, Analyzer a, MaxFieldLength mfl)/ 构造方法:第三个参数指定是否创建一个新的索引库。/ 1,有索引库,create为true:会重新创建。2,没有索引库,create为false,会报错。new IndexWriter(String/Directory indexPath, Analyzer a, boolean create, MaxFieldLength mfl)/ 添加索引addDocument( Document doc )/ 更新updateDocument(Term term, Document doc)/ 删除deleteDocument(Term term)/ 合并索引库addIndexesNoOptimize(Directory)/ 优化索引库optimize()IndexSearcher:操作索引库,查询/ 构造方法,索引库不存在,就报错new IndexSearcher( String indexPath )/ 搜索TopDocs search( Query query, Filter filer, int n )/ 搜索TopDocs search( Query query, Filter filer, int n , Sort sort)/Document doc( int docSn )Document:Lucene所操作的对象Field:组成Document的元素,代表一个属性。Store、Indexnew Field( String name, String value, Store store, Index index )Directory:索引库(目录)FSDirectory:真实的目录RAMDirectory:在内存中的一个虚拟的目录QueryParser:把查询字符串变为查询对象的工具。使用子类: MultiFieldQueryParsernew MultiFieldQueryParser(String fields, Analyzer a)Term:代表某个属性中的一个关键词(目录中出现的条目),是搜索的最小单位Query :查询对象(封装的过滤条件)。有很多子类,对应各种各样的查询方式。TopDocs(一套) :代表查询结果FilterSort3.1. DocumentLucene所能操作的一个文档。3.2. Field组成Document的元素。构造Field时,有Store与Index参数。Store.NO 取不到Index.NO 查不到说明:分词后索引:先把内容(文本)分词,得到很多词。再分别对这些词建立目录。不分词索引:“Lucene入门经典”,在搜索时,搜“Lucene”,搜不到。3.3. Term查询的最小单位。代表一个属性中的一个关键词。某个字段中的某个关键词3.4. IndexWriter操作(增删改)索引库的类。3.5. IndexSearcher在索引库中搜索的类。3.6. Directory代表存放索引库的目录(位置)。有两个子类:1,文件系统目录(FSDirectory)。2,在内存中的一个模拟的目录(RAMDirectory)3.6.1. FSDirectory3.6.2. RAMDirectory 3.7. 日期时间与数字类型的使用在对属性值进行大小比较时(通常是使用范围查询,比较数字类型的时候),是按照字符串的比较规则,因为他们都是转成字符串后存储的。这样就会出现问题,如 “20”是大于“100”的(根据字符串的比较规则)。解决的方法是:让数字转成的字符串具有相同的位数,如位数不足,就在前面补相应数量个“0”。数字到符串、字符串到数字的转换可以使用Lucene提供的工具类NumberTools完成。对于日期与字符串的双向转换,则可以使用Lucene提供的DateTools完成。3.7.1. DateTools转换日期的工具类,第二个Resolution参数可以指定日期的精度。指定Resolution中的常量值。3.7.2. NumberTools转换数字的工具类,把数字转为36进制(10个数字加上26个字母)的字符串。4. IndexDao4.1. IndexDao的使用说明(作用)完成对索引的增删改查。 4.2. 创建索引的方案4.2.1. 定时重新创建索引可以在不修改原有程序的情况下增加全文检索的功能。4.2.2. 同步创建索引4.3. 增删改查删除时指定的Term。查询的最小单位,代表一个Field中的一个关键词。在删除与更新时,指定的Term最好是可以唯一标识一条数据。一般是数据库记录对象的id或是文件的path或是网页的URL等。在完成CURD后,要增加搜索方法对分页的支持。5. 基础知识点5.1. 分词器Analyzer5.1.1. 分词器的作用使用分词器就是上图的加工分析的步骤分词器,对文本资源进行切分,将文本按规则切分为一个个可以进行索引的最小单位(关键词)。分词器(分词规则)一段文本,如下: “在Internet上采集信息的软件被叫做爬虫或蜘蛛。”切分好的关键词Internet采集信息软件爬虫蜘蛛某文档中的一段文本,经过分词后如下:12345678910111213在Internet上采集信息的软件被叫做爬虫或蜘蛛。建立索引和进行搜索时都要用到分词器。为了保证能正确的搜索到结果,在建立索引与进行搜索时使用的分词器应是同一个。5.1.2. 英文分词(分词器的工作流程)英文分词过程大致如下(一般流程):输入文本关建词切分去除停用词形态还原转为小写说明:形态还原或叫做词干抽取,比如将running还原为run,是去除单词词尾的形态变化,将其还原为词的原形。如下所示:worked workworking workstudies study如用StandardAnalyzer对“IndexWriter addDocuments a javadoc.txt”进行分词:1) 切分词“IndexWriter”、“ addDocuments”、“a”、“ javadoc.txt”2) 排除停用词“IndexWriter”、“ addDocuments”、“ javadoc.txt”3) 形态还原“IndexWriter”、“ addDocument”、“ javadoc.txt”4) 转为小写“indexwriter”、“ adddocument”、“ javadoc.txt”5.1.3. 中文分词中文的文词比较复杂,因为不是一个字就是一个词,而且一个词在另外一个地方就可能不是一个词,如在“帽子和服装”中,“和服”就不是一个词。对于中文分词,通常有三种方式:单字分词、二分法分词、词典分词。l 单字分词:就是按照中文一个字一个字地进行分词。如:“我们是中国人”,效果:“我”、“们”、“是”、“中”、“国”、“人”。(StandardAnalyzer就是这样)。l 二分法分词:按两个字进行切分。如:“我们是中国人”,效果:“我们”、“们是”、“是中”、“中国”、“国人”。(CJKAnalyzer就是这样)。l 词库分词:按某种算法构造词,然后去匹配已建好的词库集合,如果匹配到就切分出来成为词语。通常词库分词被认为是最理想的中文分词算法。如:“我们是中国人”,效果为:“我们”、“中国人”。(使用极易分词的MMAnalyzer)。可以使用“极易分词”,或者是“庖丁分词”分词器。语义在创建索引与搜索时要使用同一个分词器。5.1.4. 停用词有些词在文本中出现的频率非常高,而且对文本所携带的信息基本不产生影响,例如英文的“a、an、the、of”,或中文的“的、了、着”,以及各种标点符号等,这样的词称为停用词(stop word)。文本经过分词之后,停用词通常被过滤掉,不会被进行索引。在检索的时候,用户的查询中如果含有停用词,检索系统也会将其过滤掉(因为用户输入的查询字符串也要进行分词处理)。排除停用词可以加快建立索引的速度,还可以减小索引文件的大小。5.1.5. 测试分词器public static void printKeywords(Analyzer analyzer, String content) throws Exception System.out.println(- 分词器: + analyzer.getClass();Reader reader = new StringReader(content);TokenStream tokenStream = analyzer.tokenStream(content, reader);Token token = new Token();while (token = tokenStream.next(token) != null) System.out.println(token);StandardAnalyzerSimpleAnalyzerChineseAnalyzerCJKAnalyzerMMAnalyzer5.2. 高亮器Highligher作用:1, 截取摘要2, 高亮关键字可以截取一段文本(生成摘要),并且让关键字高亮显示(通过指定前缀与后缀实现,因为是在网页中显示,例如指定 “”,“”,就会在网页中显示为红色)。在指定前后缀时,指定比较好。因为这样可以在css文件中定义关键字中显示的效果。5.3. 排序5.3.1. 相关度排序实验步骤:1, 有相关度排序。2, 影响相关度排序a) 整个Documentb) 某个FieldLucene的搜索结果默认按相关度排序的。所谓相关度,就是文档的得分。Lucene有一个评分机制,就是对检索结果按某种标准进行评估,然后按分值的高低来对结果进行排序。1, 文档的得分与用户输入的关键字有关系,而且是实时运算的结果。得分会受关键字在文档中出现的位置与次数等的影响。2, 可以利用Boost影响Lucene查询结果的排序,通过设置Document的Boost来影响文档的权重,以达到控制查询结果顺序的目的:Document.setBoost(float)。默认值为1.0f,值越大,得分越高。3, 也可以在查询时给Filed指定boost:Field.setBoost(float)。当同样的term属于不同的field时,如果field的boost不一样,其所属的文件的得分也不一样。影响相关度排序的得分:1. Document的boost属性:Document. setBoost(float boost)2. Field的boost属性:Field. setBoost(float boost)3. 查询时指定不是覆盖Field.setBoost()设置的值,而是叠加。可以做实验验证。: MultiFieldQueryParser(String fields, Analyzer analyzer, Map boosts)5.3.2. 按指定字段排序there are more terms than documents in field name, but its impossible to sort on tokenized fieldspublic Sort(SortField field)public Sort(SortField fields)5.4. 过滤器RangeFilter,可以对搜索出来的结果进行过滤。5.5. 查询对象1.1.1. QueryParser与MultiFieldQueryParser1.1.2. TermQuery关键词查询1.1.3. RangeQuery范围查询1.1.4. WildcardQuery通配符查询1.1.5. PhraseQuery短语查询public void add(Term term, int position)public void setSlop(int s)例:add( new Term(“name”, “lucene”, 1);add(new Term(“name”, “教程”, 3);代表搜索的是“Lucene ? 教程”,?表示中间隔一个词。setSlop(2);如果指定了多个词,则是各个词之间的隔的数量的的和代表这两个词中间可以最多隔2个词

温馨提示

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

评论

0/150

提交评论