在非关系型数据库中,数据是非结构化的,如果直接去查找效率极低,全文检索将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。索引就是从非结构化数据中提取出的然后重新组织的信息。建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。在了解了全文检索的过程后,下面介绍最近学习的ElasticSearch全文检索引擎。
1、ElasticSearch简介
Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,可以在java开发中使用,其核心还是Lucene,但是es在开发中使用
可以通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。另外es检索和存储速度极快,即搜即得到结构,修改便可近乎实时的保存。
Elaticsearch目前有被很多大型网站使用,如GitHub使用ElasticSearch
搜索20TB的数据,包括13亿文件和1300亿行代码,百度目前广泛使用ElasticSearch作为文本数据分析,采集百度所有服务器上的各类指标数
据及用户自定义数据,通过对各种数据进行多维分析展示,辅助定位分析实例异常或业务层面异常。新浪、阿里等许多大厂也在采用Elaticsearch全文搜索引擎
2、ElasticSearch术语
ElasticSearch术语包含index索引、Types类型、Documents、Fields,其中index可以理解为是关系型数据库里面的database,types可以对应为关系型数据库里面的表tables,documents可以以对应为关系型数据库里面的记录,fields以以对应为关系型数据库里面的字段。
2.1、index索引
一个index索引就是一个拥有几分相似特征的文档的集合。一个索引由一个全是小写字母组成的名字来标识,使用到这个名字对对应于这个索引中的文档进行索引、搜索、更新和删除。在一个集群中,可以定义任意多的索引。
2.2、type类型
在一个索引中,可以定义一种或多种类型。一个类型是索引的一个逻辑上的分类/分区,其语义完全支持自定义。通常,会为具有一组共同字段的文档定义一个类型。
2.3、document文档
文档是可被索引的基础信息单元。文档采用JSON格式。在index/type里面,可以存储任意多的文档。文档在物理上存在于索引之中,但文档必须被索引/赋予一个索引的type。
2.4、field字段
相当于是数据表的字段,对文档数据根据不同属性进行的分类标识。
2.5、 mapping映射
mapping对处理数据的方式和规则做限制,某个字段的数据类型、默认值、分析器、是否被索引等等都可以被映射设置,另外处理es里面数据的一些使用规则设置也叫做映射,如按着最优规则处理数据以至于性能提高。
2.6、 cluster集群和node节点
集群就是由一个或多个节点组织在一起,所有节点的数据共同组成了所有数据,并一起提供索引和搜索功能。每个集群都有唯一标识的名字,默认就是“elasticsearch”。节点想组成或加入集群需要共同加入同一个名字的集群。
节点是集群中的一个服务器,是集群的一部分,可以存储数据并且参与集群的索引和搜索。每个节点也都有唯一标识的名字。
3、ElasticSearch使用
使用DSL语言来定义查,使用全文检索
(1)查询所有索引
GET /_cat/indices?v
(2)删除某个索引
DELETE /索引名
在这里插入代码片
(3)新增索引
PUT /索引名
(4)创建映射
PUT /索引名/type名/_mapping {
"properties": {
"name":{
"type": "text",
"analyzer": "所用的分词器",
"search_analyzer": "所用的分词器"
}
}
}
(5)新增文档数据/修改数据
PUT /索引名/type名/id号 {
"name":"赵二",
"age":22,
"city":"上海",
"description":"xxxxx"
}
(6)更新数据
POST /索引名/type名/id号/_update {
"doc":{
"name":"xxx",
"description":"xxxxxx"
}
}
(7)删除Document
DELETE /索引名/type名/id号
(8)查询所有数据
GET /索引名/_search
上面是一些常用的DSL语句,可以在 Kibana或者elasticsearch-head中使用进行全文检索