ES基础信息
数据分类
我们生活中的数据总体分为两种,结构化数据和非结构化数据
结构化数据:指具有固定格式或者有限长度的数据,如数据库,元数据等
非结构化数据:指不定长或者无固定格式的数据,如邮件,word文档等磁盘上的文件
结构化数据搜索
常见的结构化数据也就是数据库中的数据
再数据库中搜索很容易实现,通常都是使用sql语句来进行查询,而且可以很快的得到查询结果
为什么数据库搜索很容易:因为数据库中的数据是规律的,有行有列而且数据格式,数据长度都是固定的
非结构化数据查询方法
顺序扫描法
在Windows上面搜索包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完为止,例如windows的搜索也可以搜索文件内容,只是相当慢
全文检索(Full-text Search)
用户通过查询索引库---->生成索引----->文档
全文检索是指计算机索引程序通过扫描文件中的每一个词,对每一个词建立一个索引,知名该词再文档中出现的次数和位置,,当用户查询时,检索程序就会根据实现建立的索引进行查找,并将查找结果反馈给用户的检索方案,这个过程类似于通过字典的目录查字的过程
将非结构化数据的一部分信息提取出来,重新组织,使其变得有一定的结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对比较快的目的,这部分从非结构化数据中提取出来的然后重新组织的信息,我们称之为索引
这种先建立索引,然后再对索引进行搜索的过程就叫做全局检索,虽然创建索引的过程也是非常好是的,但是索引一但创建就可以多次使用,全文检索主要处理的是查询,所以耗时间创建,索引是值得的
实现全文检索的方法
可以使用LUcene,来实现全文检索,Lucene是apache下的一个开发源代码的全文检索引擎工具包,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言),Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索功能
lucene入门
Lucene适用的场景
在应用中为数据库中的数据提供全文检索实现
开发独立的搜索引擎服务,系统
Lucene的特性
稳定,索引性能高
每小时能够索引150G以上的数据
对内存的要求小,只需要1MB的堆内存
增量索引和批量索引一样块
索引的大小越为索引文本大小的20%-30%
高效,准确,高性能的搜索算法
良好的搜索排序
强大的查询方法支持:短语查询,通配符查询,临近查询,范围查询等
支持字段搜索:如标题,作者,内容等
可根据任意字段排序
支持多个索引查询结果合并
支持更新操作和查询操作同时进行
支持高亮,join,分组结果功能
速度快
可拓展排序模块,内置包含向量空间模型,BM25模型可选
可配置存储引擎
跨平台
纯java编写
作为apache开元许可下的开源项目,可以再商业或者开源项目中使用
lucene有多钟语言实现版(如C,C++,Python等)不仅仅是java
Lucene索引原理
参考文档地址
ElasticSearch入门
定义
ElasticSearch简称ES,ES是一个分布式全文搜索引擎,为了解决原生lucene使用的不足,优化Lucene的调用方式,并实现了高可用的分布式集群的搜索方案,ES的索引库管理支持依然是基于Apache Lucene(TM)的开源搜索引擎
ES也是用java开发并使用LUcene所谓其核心来实现所有的索引和搜索功能,他的是通过简单的RESTFul API来隐藏Lucene的复杂性,从而让全文索引变得简单
ES的特点
分布式的近实时文件存储,Mysql是实时的
能在分布式项目/集群中使用
本身支持集群拓展,可以拓展到上百台服务器
处理PB级结构化或者非结构化数据
简单的RestFul Api通信方式
支持各种语言的客户端:java, js
基于Lucene封装,使操作简单
ES中关键字说明
index->type->mapping->document->field
index:Mysql中的一张表
type:一个index中可以有多个Type,每个type的字段都是差不多的,但是有一些略微差别
mapping:一个type有一个mapping,如果说type是一个具体的表,index代表了多个Type同属的一个类型,mapping就是这个type的表结构定义
document:往index中的一个type里面写入一条数据,叫做一条document,一条document就代表了mysql中某个表里的一行数据,
field:每个document有多个Field,每个field就代表了document中的一个字段的值