前言
elasticsearch是基于Luncene创建的搜索引擎,在学习es之前,先对Luncene进行学习,本章是对拉勾教育Lucene基础进行学习
1. 全文检索
我们生活中的数据分为:结构化数据
和非结构化数据
非结构化数据又一种叫法叫全文数据。
数据库适合结构化数据的精确查询,而不适合半结构化、非结构化数据的模糊查询及灵活搜索(特别是数据量大时),无法提供想要的实时性。
2. 全文检索的查询方法
2.1 顺序扫描法
所谓顺序扫描,就是要找内容包含一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。
这种方法是顺序扫描方法,数据量大就搜索慢。
2.2 全文检索
全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。
全文检索的基本思路,就是将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对这个有一定结构的数据进行搜索,从而达到搜索相对较快的目的。
这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引 ,这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search) 。
具体应用的有 单机软件的搜索(word中的搜索) 站内搜索 ( 京东、 taobao、拉勾职位搜索) 专业搜索引擎公司 (google、baidu)的搜索
2.3 全文检索与倒排索引
全文检索通常使用倒排索引(inverted index)来实现。倒排索引同B树索引一样,也是一种索引结构。其中存储了单词与单词自身在一个或多个文档中所在位置之间的映射。
倒排索引(Inverted Index): 被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。
“关键词1”:“文档1”的ID 出现次数 出现的位置,“文档2”的ID 出现次数 出现的位置,…………。
“关键词2”:带有此关键词的文档ID列表。
倒排索引主要由两个部分组成:“单词词典”
和“倒排文件”
3. Lucene 简介
3.1 什么是Lucene
Lucene的作者Doug Cutting是资深的全文索引/检索专家,最开始发布在他本人的主页上,2000年开源,2001年10月贡献给APACHE,成为APACHE基金的一个子项目。官网 https://lucene.apache.org/core。现在是开源全文检索方案的重要选择。
Lucene是非常优秀的成熟的开源的免费的纯java语言的全文索引检索工具包。
Lucene是一个高性能、可伸缩的信息搜索(IR)库。 Information Retrieval (IR) library.它可以为你的应用程序添加索引和搜索能力。
Lucene是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。由Apache软件基金会支持和提供,Lucene提供了一个简单却强大的应用程序接口,能够做全文索引和搜索。
Lucene是当前以及最近几年非常受欢迎的免费Java信息检索程序库。
3.2 Lucene 的实现产品
作为一个开放源代码项目,Lucene从问世之后,引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种系统软件中去,以及构建Web应用,甚至某些商业软件也采用了Lucene作为其内部全文检索子系统的核心。
Nutch:
Apache顶级开源项目,包含网络爬虫和搜索引擎(基于lucene)的系统(同 百度、google)。Hadoop因它而生。
Solr :
Lucene下的子项目,基于Lucene构建的独立的企业级开源搜索平台,一个服务。它提供了基于xml/JSON/http的api供外界访问,还有web管理界面。
Elasticsearch:
基于Lucene的企业级分布式搜索平台,它对外提供restful-web接口,让程序员可以轻松、方便使用搜索平台。
还有大家所熟知的OSChina
、Eclipse
、MyEclipse
、JForum
等等都是使用了Lucene做搜索框架来实现自己的搜索部分内容,在我们自己的项目中很有必要加入他的搜索能力,可以大大提高我们开发系统的搜索体验度。
3.3 Lucene 特性
稳定、索引性能高
每小时能够索引150GB以上的数据。
对内存的要求小 只需要1MB的堆内存
增量索引和批量索引一样快。
索引的大小约为索引文本大小的20%~30%。
高效、准确、高性能的搜索算法
范围搜索 - 优先返回最佳结果很多强大的
良好的搜索排序
强大的查询方式支持:短语查询、通配符查询、临近查询、范围查询等
支持字段搜索(如标题、作者、内容
可根据任意字段排序
支持多个索引查询结果合并
支持更新操作和查询操作同时进行
支持高亮、join、分组结果功能
速度快
可扩展排序模块,内置包含向量空间模型、BM25模型可选
可配置存储引擎
跨平台
纯java编写。
作为Apache开源许可下的开源项目,你可在商业或开源项目中使用。
Lucene有多种语言实现版可选(如C、C++、Python等),不只是JAVA。
3.3 Lucene 模块组成
Lucene是一个用Java写的高性能、可伸缩的全文检索引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。Lucene的目标是为各种中小型应用程序加入全文检索功能。