• 1. Lucene使用心得分享 支付组 廖旭 2011.8
  • 2. Lucene简介Lucene是apache软件基金会 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎应用,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。 Lucene最初是由Doug Cutting开发的,在SourceForge的网站上提供下载。在2001年9月做为高质量的开源Java产品加入到Apache软件基金会的 Jakarta家族中。随着每个版本的发布,这个项目得到  Lucene 明显的增强,也吸引了更多的用户和开发人员。
  • 3. 什么是全文检索全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。
  • 4. Lucene版本历史0.01 2000年3月 第一个开源版本(SourceForge) 1.0 2000年10月 1.01b 2001年7月 最后的SourceForge版本 1.2 2002年6月 第一个Apache Jakarta版本 1.3 2003年12月 复合索引格式,查询分析器增加,远程搜索,token定位,可扩展的API 1.4 2004年7月 Sorting, span queries, term vectors 1.4.1 2004年8月 排序性能的bug修正 1.4.2 2004年10月 IndexSearcher optimization and misc. fixes 1.4.3 2004年冬 Misc. fixes2.4.1 2009年3月8日发布新版本 2.3.0 2008年1月 更新为2.3.0 2.4.0 2008年10月 更新为2.4.0 2.4.1 2009年 5月 更新为 2.4.1 2.9.0 2009年9月25号 更新为2.9.0 2.9.1 2009年11月6号 更新为2.9.1 3.0.0 2009年11月25号 更新为3.0.0 3.0.1 2010年2月26号 更新为3.0.1 3.0.2 2010年6月18号 更新为3.0.2 3.0.3 2010年12月3号 更新为3.0.3 最新版本3.3(2011年7月1日发布)
  • 5. 哪些网站在使用Luceneapple.com aol.com eclipse.org linkedin.com www.atlassian.com/software/jira/ 更多见http://wiki.apache.org/jakarta-lucene/PoweredBy
  • 6. Lucene和传统数据库
  • 7. Lucene的创新之处
  • 8. 应用程序和Lucene的关系
  • 9. Lucene的优点索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。 在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。 优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。 设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。 已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search)、分组查询等等。 对中文支持良好
  • 10. Hello world
  • 11. Hello world
  • 12. 倒排索引(inverted index)In computer science, an inverted index (also referred to as postings file or inverted file) is an index data structure storing a mapping from content, such as words or numbers, to its locations in a database file, or in a document or a set of documents. The purpose of an inverted index is to allow fast full text searches, at a cost of increased processing when a document is added to the database. The inverted file may be the database file itself, rather than its index. It is the most popular data structure used in document retrieval systems,[1] used on a large scale for example in search engines. Several significant general-purpose mainframe-based database management systems have used inverted list architectures, including ADABAS,DATACOM/DB, and Model 204. 倒排索引(英语:Inverted index),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。
  • 13. 倒排索引(inverted index)例如,下面是要被索引的文本: T0 = "it is what it is" T1 = "what is it" T2 = "it is a banana" 我们可以得到下面的完全反向文件索引(full inverted index) : "a": {(2, 2)} "banana": {(2, 3)} "is": {(0, 1), (0, 4), (1, 1), (2, 1)} "it": {(0, 0), (0, 3), (1, 2), (2, 0)} "what": {(0, 2), (1, 0)} 如果我们执行短语搜索"what is it" 我们得到这个短语的全部单词各自的结果所在文档为文档0和文档1。但是这个短语检索的连续的条件仅仅在文档1得到。
  • 14. Tips对于检索系统来说核心是一个排序问题 使用like “%keyword%”时,数据库索引是不起作用的 大部分的搜索(数据库)引擎都是用B树结构来维护索引,索引的更新会导致大量的IO操作,Lucene在实现中,对此稍微有所改进:不是维护一个索引文件,而是在扩展索引的时候不断创建新的索引文件,然后定期的把这些新的小索引文件合并到原先的大索引中(针对不同的更新策略,批次的大小可以调整),这样在不影响检索的效率的前提下,提高了索引的效率
  • 15. Lucene中的重要概念(一)索引核心类 Analyzer 文本文件被索引之前,需要经过Analyzer处理,有IndexWriter的构造方法指定,负责从被索引文本文件中提取token,并剔除余下的词语 Document 是用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件。一个 Document 对象由多个 Field 对象组成的。可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一个字段 Directory 这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置 Field 用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个 Field 对象分别描述 IndexWriter 是 Lucene 用来创建索引的一个核心的类,他的作用是把一个个的 Document 对象加到索引中来
  • 16. Analyzer的工作机制
  • 17. Field(String name, String value, Field.Store store, Field.Index index, Field.TermVector termVector) Field.Store 原始字段是否存储 Field.Store.YES: 存储字段值(未分词前的字段值)  Field.Store.NO: 不存储,存储与索引没有关系 Field.Index 原始字段是否以及如何被索引 Field.Index.ANALYZED:分词建索引  Field.Index.ANALYZED_NO_NORMS:分词建索引,但是Field的值不像通常那样被保存,而是只取一个byte,这样节约存储空间  Field.Index.NOT_ANALYZED:不分词且索引  Field.Index.NOT_ANALYZED_NO_NORMS:不分词建索引,Field的值去一个byte保存 Field.Index.No:不分词不索引 No norms means that index-time field and document boosting and field length normalization are disabled. The benefit is less memory usage as norms take up one byte of RAM per indexed field for every document in the index Field.TermVector 表示文档的条目(由一个Document和Field定位)和它们在当前文档中所出现的次数
  • 18. Lucene中的重要概念(二)搜索核心类 IndexSearcher 是用来在建立好的索引上进行搜索的。它只能以只读的方式打开一个索引,所以可以有多个 IndexSearcher 的实例在一个索引上进行操作。 Term 是搜索的基本单位,一个 Term 对象有两个 String 类型的域组成。 Query 这是一个抽象类,他有多个实现,比如 TermQuery, BooleanQuery, PrefixQuery. 这个类的目的是把用户输入的查询字符串封装成 Lucene 能够识别的 Query TopDocs 是一个简单的指针容器,一般指向前N个排名的搜索结果,搜索结果即匹配查询条件的文档
  • 19. TermQuery TermRangeQuery NumericRangeQuery PrefixQuery BooleanQuery PhraseQuery WildcardQuery FuzzyQuery MoreLikeThisQuery
  • 20. Lucene包结构analysis 语言分析器 collation 排序功能 document 存储结构 index 索引入口 queryParser 搜索语法解析 search 搜索入口 store 存储功能 util 工具类
  • 21. Lucene的评分机制tf(t in d) term(t)出现在 document(d)中的频率 idf(t) term(t)在倒排文档中的频率,越稀有此值越高 boost(t.field in d) term在document中的权值 computForm 命中越长的field得分越低 coord 协调因子 queryForm 可以通过重写自己的Similarity实现自己的评分规则
  • 22. Lucene索引文件.fnm 域名存储文件,包含了Document中的所有field名称 .tii 是.tis文件的索引文件,它标明了每个.tis文件中的词条的位置 .tis 用于存储分词后的Term .frq Term频率文件 .prx Term位置文件 .nrm 加权信息 .fdx 域数据索引文件 .fdt 域数据文件
  • 23. Apache SolrSolr是一个基于Lucene java库的企业级搜索服务器,包含XML/HTTP,JSON API, 高亮查询结果,faceted search(不知道该如何翻译,片段式搜索),缓存,复制还有一个WEB管理界面。Solr运行在Servlet容器中。 Solr是Lucene面向企业搜索应用的扩展。
  • 24. ThanksQ&A