【搜索那些事】细谈lucene(一)初识全文资源检索框架lucene
一:lucene历史和简介
Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
Lucene最初是由Doug Cutting所撰写的,他是一位资深的全文索引及检索专家,曾经是V-Twin搜索引擎的主要开发者,后来在Excite担任高级系统架构设计师,目前从事于一些INTERNET底层架构的研究。他同时也是当前最火的大数据处理框架hadoop的创始人,其实,hadoop刚开始就是以Lucene的子项目Nutch的一部分正式引入的。我也打算在“搜索那些事”系列博客中可以从lucene——》nutch——hadoop的一点点的全部写出来。Doug Cutting贡献出Lucene的目标是为各种中小型应用程式加入全文检索功能。lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化的文本的,Lucene 就能对你的文档进行索引和搜索。比如你要对一些 HTML 文档,PDF 文档进行索引的话你就首先需要把 HTML 文档和 PDF 文档转化成文本格式的,然后将转化后的内容交给 Lucene 进行索引,然后把创建好的索引文件保存到磁盘或者内存中,最后根据用户输入的查询条件在索引文件上进行查询。不指定要索引的文档的格式也使 Lucene 能够几乎适用于所有的搜索应用程序。尽管当时lucene是由Java编写的,不过由于它设计思想的先进和用于广泛,所以现在已有其他编程语言的版本(c/c++,c#,Python等)。已经有很多Java项目都使用了Lucene作为其后台的全文索引引擎,比较著名的有:
- Jive:WEB论坛系统;
- Eyebrows:邮件列表HTML归档/浏览/查询系统,本文的主要参考文档“TheLucene search engine: Powerful, flexible, and free”作者就是EyeBrows系统的主要开发者之一,而EyeBrows已经成为目前APACHE项目的主要邮件列表归档系统。
- Cocoon:基于XML的web发布框架,全文检索部分使用了Lucene
- Eclipse:基于Java的开放开发平台,帮助部分的全文索引使用了Lucene
二:lucene特性简介
我们处在一个信息爆炸的时代,所以信息搜索对于当前社会发展是非常重要的。作为一个开放源代码项目,Lucene从问世之后,引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种系统软件中去,以及构建Web应用,甚至某些商业软件也采用了Lucene作为其内部全文检索子系统的核心。apache软件基金会的网站使用了Lucene作为全文检索的引擎,IBM的开源软件eclipse的2.1版本中也采用了Lucene作为帮助子系统的全文索引引擎,相应的IBM的商业软件Web Sphere中也采用了Lucene。Lucene以其开放源代码的特性、优异的索引结构、良好的系统架构获得了越来越多的应用。
Lucene作为一个全文检索引擎,其具有如下突出的优点:
(1)索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
(2)在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。
(3)优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。
(4)设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。
(5)已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search[11])、分组查询等等。
特性:
1.索引过程:
· 在现在流行的硬件平台上每个小时可处理超过 150GB 的数据
· 内存占用小,只需 1MB 的堆内存
· 增量索引和批量索引速度一样快
· 索引大小约为文本索引的 20-30% 大小
· 静态索引修剪
2.搜索算法:
· 范围搜索 - 优先返回最佳结果
· 很多强大的查询类型:短语查询、通配符查询、近似查询、范围查询等
· 可单独针对某个字段查询
· 可单独根据某个字段排序
· 多索引搜索并合并搜索结果
· 允许同步更新索引和搜索
· 灵活的门面搜索、高亮显示、结果集的联合和分组
· 快速,低内存占用和容错
· 可插入式排名模型,包括 VSM 和Okapi MB25
· 可配置的存储引擎
3.跨平台解决方案
· 100% 纯 Java
· 其他语言提供索引兼容的实现
搜索应用程序和 Lucene 之间的关系,也反映了利用 Lucene 构建搜索应用程序的流程:
三:索引和搜索
索引是现代搜索引擎的核心,建立索引的过程就是把源数据处理成非常方便查询的索引文件的过程。为什么索引这么重要呢,试想你现在要在大量的文档中搜索含有某个关键词的文档,那么如果不建立索引的话你就需要把这些文档顺序的读入内存,然后检查这个文章中是不是含有要查找的关键词,这样的话就会耗费非常多的时间,想想搜索引擎可是在毫秒级的时间内查找出要搜索的结果的。这就是由于建立了索引的原因,你可以把索引想象成这样一种数据结构,他能够使你快速的随机访问存储在索引中的关键词,进而找到该关键词所关联的文档。Lucene 采用的是一种称为反向索引(inverted index)的机制。反向索引就是说我们维护了一个词 / 短语表,对于这个表中的每个词 / 短语,都有一个链表描述了有哪些文档包含了这个词 / 短语。这样在用户输入查询条件的时候,就能非常快的得到搜索结果。我们将在本系列文章的第二部分详细介绍 Lucene 的索引机制,由于 Lucene 提供了简单易用的 API,所以即使读者刚开始对全文本进行索引的机制并不太了解,也可以非常容易的使用Lucene 对你的文档实现索引。对文档建立好索引后,就可以在这些索引上面进行搜索了。搜索引擎首先会对搜索的关键词进行解析,然后再在建立好的索引上面进行查找,最终返回和用户输入的关键词相关联的文档。对于中文用户来说,最关心的问题是其是否支持中文的全文检索。由于Lucene良好架构设计,对中文的支持只需对其语言词法分析接口进行扩展就能实现对中文检索的支持。
推荐阅读:搜索那些事——细谈lucene(二)lucene搜索程序组件详解
参考资料:
lucene百度百科:http://baike.baidu.com/view/371811.htm
实战lucene:http://www.ibm.com/developerworks/cn/java/j-lo-lucene1/
七个搜索引擎:http://www.oschina.net/news/39289/7-search-engines-for-big-data
【搜索那些事】细谈lucene(一)初识全文资源检索框架lucene相关推荐
- 细谈Struts2 详解
(一)自己实现struts2框架 Struts最早是作为Apache Jakarta项目的组成部分,项目的创立者希望通过对该项目的研究,改进和提高JavaServer Pages .Servlet.标 ...
- 细谈JVM垃圾回收与部分底层实现
JVM系列文章目录 初识JVM 深入理解JVM内存区域 玩转JVM对象和引用 JVM分代回收机制和垃圾回收算法 细谈JVM垃圾回收与部分底层实现 Class文件结构及深入字节码指令 玩转类加载和类加载 ...
- 细谈渗透测试的前期工作——信息收集
细谈渗透测试的前期工作--信息收集 前言 0x01 收集什么信息 0x02 作用和收集方法 总结 前言 都说学安全的,查资料找信息什么的都是基本功,收集信息的能力都是杠杠的,经常网上有什么热门的事情, ...
- 细谈微信怎么打开链接可以避免提示已停止访问该网页
很多朋友都已经习惯在微信内分享网页链接和二维码了,通过扫描二维码下载APP或打开网页也成为大家惯用且非常方便的方式了.如此微信就成为了扫描二维码重要的工具,说到二维码大家第一反应就是打开微信扫一扫,这 ...
- windows server 2003 DNS 细谈系列之(二)记录类型、数据库
windows server 2003 DNS 细谈系列之(二)记录类型.数据库<?xml:namespace prefix = o ns = "urn:schemas-microso ...
- QT乱码总结4.细谈本地编码
QT乱码总结0.Qt乱码产生因素 https://blog.csdn.net/liujiayu2/article/details/103167953 QT乱码总结1.Unicode 和 UTF-8 h ...
- lucene使用3.0.3_使用Apache Lucene 4.3轻松进行搜索
lucene使用3.0.3 Lucene是用Java编写的全文搜索引擎,可以为任何应用程序提供强大的搜索功能. Lucene的核心是基于文件的全文本索引. Lucene提供API创建该索引,然后向该索 ...
- Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解...
在上篇博客中,我们介绍了<hibernate基本概念和体系结构>,也对hibernate框架有了一个初步的了解,本文我将向大家简单介绍Hibernate的核心API调用库,并讲解一下它的基 ...
- 细谈getRequestDispatcher()与sendRedirect()的区别
问题?细谈getRequestDispatcher()与sendRedirect()的区别 首先我们要知道: (1)request.getRequestDispatcher()是请求转发,前后页面共享 ...
最新文章
- 京东运营插件_技术中台产品经理必知的那些易混词儿(1):组件、套件、 中间件、插件……...
- 【学习笔记】Python - NumPy
- 微软正在用实际行动告诉你: 拥抱开源,微软是认真的
- 内存spd规范_C语言内存泄露很严重,如何应对?
- java重置radiobutton的选项_求助:这道题显示radiobutton男女的功能和重置功能怎么做...
- 我们究竟该看待百度更新?
- html5 数据初始化,使用HTML5中的element.dataset操作自定义data-*数据
- 2019-06-11_Python中文编码
- appium 驱动 对应9.0 系统_第一章:appium
- 关于CocosStudioV3.10的场景导入Cocos2d-xV3.17.2场景未发生变化的解决方案
- mysql 表单插入数据_PHP表单数据写入MySQL数据库的代码
- 本科毕业设计论文答辩ppt模板
- 用正则表达式爬CBO年度票房
- html整体字体微软雅黑,网页布局中对全局字体的最佳控制_html/css_WEB-ITnose
- www.idcnd.net传媒官方客服提供
- 【powerBI_001】DAX函数之RELATED和RELATEDTABLE用法
- C# Stream篇(五) -- MemoryStream
- 深度学习基础--Bottleneck(瓶颈) Architectures
- python创建一个空元组_如何在Python中从空元组创建元组?
- 算法之克鲁斯卡尔(Kruskal)算法
热门文章
- 一个文档读懂计算机网络
- 游戏策划全接触之游戏剧本篇-----原创
- BI 前端实践 6:自定义模板展示多维分析结果
- 驾考 科目一 扣分罚款 复习的内容
- python使用matplotlib绘制鼠标路径
- es教程——地图搜索
- BioNano生物纳米分子的“原始数据到完成装配和组装分析”管线与基于序列的基因组FASTA映射...
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(9)链表
- 查看 NLS_LANG 的方法
- 浅谈 C/S 和 B/S 架构