ElasticSearch,简称为ES,是一个开源的高可用,高可扩展的分布式全文搜索引擎,可以视为全文搜索数据库。它可以实现近实时的存储和检索。可以相对方便的扩展到多台服务器上,实现集群的搭建,从而提高吞吐量。
ES是基于Lucene做的封装和增强,可通过简单的RESTful API实现各种复杂的操作。
ELK(ElasticSearch + Logstash + Kibana)是数据日志收集分析的统称,其中Logstash是日志数据收集服务,负责数据的收集;ES负责将数据进行存储;Kibana负责将数据进行展示。
window下安装为开箱即用,Linux 安装需要一定的配置。安装过程不再赘述,需要安装ES,以及Kibana用于执行命令,安装head用于查看数据以及监测集群的健康状态。
索引(Index),由于ES本身属于非关系型数据库,所以没有严格的库表结构取而代之的是索引。可以将索引对应到数据库的概念,或者单纯的理解为一批具有类似结构数据的容器(集合)。其中一个索引可以有多个分片,以及分片对应的副本。
分片(shards)可以理解为是一种物理概念,直观感受是将一个索引进行拆分,每一部分就可以理解为是分片,这个分片称之为主分片。对应的复制分片可以理解为副本,主分片具有上限(5个),一个主分片的副本没有规定。ES提出主分片以及副本是考虑了高可用(数据冗余不丢失)和高性能(数据查询更快速)的要求。
文档(document),这个可以理解为索引中存储的数据,对应于关系型数据库中的行数据概念。此外需要注意的是,文档和索引之间还有一个类型(Type)的概念,可以对应于关系型数据库中的表的概念,但是随着ES的版本更新,这一概念最终也会被弃用。
字段(field),是文档中的最小的数据单元,可以表示这个数据的的含义,以及类型。
映射(mapping),是随着索引创建后,规范当前索引数据的各个字段以及对应的类型的定义数据。ES可以根据插入的数据自动的生成对应的mapping,但是为了防止出现自动生成的与预先设定的出现偏差,需要进行手动的显示定义。
倒排索引,在搜索领域和NLP相关的内容中非常常见,,本质就是根据字词映射对应的文档列表,不做过多解释。
IK分词器,ES是针对英文做文本处理,拥有自己标准的分词工具。但是对于中文,天然不存在词汇之间的空格分隔,所以需要用适合的分词器将连续的文本分为一个个词汇。ik分词器便是对中文文本分词的支持插件(工具),拥有两种模式,ik_smart(最小切分)和ik_max_word(所有可能切分)。分词器还支持自定义的此表,用于对未登录词汇的切分。
RESTful风格
方法 | URL地址 | 说明 |
---|---|---|
PUT | localhost:9200/索引名称/类型名称/文档id | 创建,修改文档(指定文档id) |
POST | localhost:9200/索引名称/类型名称 | 创建文档(随机文档id) |
POST | localhost:9200/索引名称/类型名称/文档id/_update | 修改文档 |
DELETE | localhost:9200/索引名称/类型名称/文档id | 删除文档 |
GET | localhost:9200/索引名称/类型名称/文档id | 通过id查询文档 |
POST | localhost:9200/索引名称/类型名称/文档id/_search | 查询所有数据 |
字段的数据类型:
创建索引
发送PUT请求直接创建索引
http://localhost:9200/shopping
利用映射创建索引
发送PUT请求
http://localhost:9200/shopping
{
"mappings":{
"properties":{
"name":{"type": "text"},
"age": {"type": "long"},
"birthday": {"type": "date"}
}
}
}
单独创建映射
先创建索引后单独设置映射关系
发送PUT请求
http://localhost:9200/shopping/_mapping
{
"properties":{
"name":{
"type": "text",
"index": true
},
"sex": {
"type": "keyword", # 不可被分词,搜索时仅可以完全匹配
"index": true
},
"tel": {
"type": "keyword",
"index": false # 不可被索引,搜不到这个字段的信息
}
}
}
查询索引的映射
发送GET请求
http://localhost:9200/shopping/_mapping
查看所有索引
发送GET请求
http://localhost:9200/_cat/indices?v
查看单个索引
发送GET请求, 查看索引的详细信息
http://localhost:9200/shopping
删除索引
发送DELETE请求
http://localhost:9200/shopping
创建文档
发送POST请求
http://localhost:9200/shopping/_doc
{
"title": "小米手机",
"category": "小米",
“price”: 3999.00
}
由于没有给定id,所以ES会自动生成一个随机的id,该方式只能发送POST请求,而PUT请求需要明确id
发送PUT请求
http://localhost:9200/test3/_doc/1
{
"name": "张三",
“age”: 18
}
修改文档
发送PUT请求,会覆盖所有字段,且更新数据中不包含的字段会被删除
http://localhost:9200/test3/_doc/1
{
"name": "李四"
}
发送POST请求,会保留所有字段,更新新数据到原有文档中
http://localhost:9200/shopping/_doc/1/_update
{
"title": "华为手机"
}
删除文档
发送DELETE请求
http://localhost:9200/shopping/_doc/1
当前删除为逻辑删除,并不会马上进行物理删除。
根据文档id查询
发送GET请求
http://localhost:9200/shopping/_doc/1
查询文档下的所有内容
发送GET请求
http://localhost:9200/shopping/_search
带有请求体的方式
http://localhost:9200/shopping/_search
{
"query":{
"match_all": {}
}
}
条件查询
发送GET请求
http://localhost:9200/shopping/_search
{
"query":{
"match":{
"category": "小米"
}
}
}
返回指定字段
发送GET请求
http://localhost:9200/shopping/_search
{
"query":{
"match_all": {}
},
"_source": ["title"]
}
分页查询
http://localhost:9200/shopping/_search
{
"query":{
"match_all":{}
},
"from": 0,
"size": 2
}
查询排序
http://localhost:9200/shopping/_search
{
"query": {
"match_all":{}
},
"sort":{
"price":{
"order": "desc"
}
}
}
多条件查询
逻辑与 must 逻辑或 should
http://localhost:9200/shopping/_search
{
"query":{
"bool":{
"must": [{
"match": {
"categroy": "小米"
}
},{
“match”: {
"price": 3999.00
}
}]
}
}
}
范围查询
http://localhost:9200/shopping/_search
{
"query":{
"bool": {
"should":[{
"match":{
"categroy": ”小米“
}
},{
"match":{
"categroy": ”华为“
}
}
]
},
"filter":{
"range":{
"price":{
"gt": 2000
}
}
}
}
}
全文检索(匹配数组)
查询query进行分割,再召回进行搜索
http://localhost:9200/shopping/_search
{
"query":{
"match":{
"categroy": "小 为"
}
}
}
完全匹配
不会将查询语句进行分词处理的查询
http://localhost:9200/shopping/_search
{
"query":{
"match_phrase":{
"categroy": "小 为"
}
}
}
精确查询
term代表精确匹配,不会对搜索文本进行分词,并且对keyword进行匹配,text被分词后,有可能不会被查询出来
http://localhost:9200/shopping/_search
{
"query":{
"term":{
"name": "张三"
}
}
}
高亮查询
http://localhost:9200/shopping/_search
{
"query":{
"match":{
"name": "张三"
}
},
"highlight":{
"pre_tags": "",
"post_tags": ""
"fields":{
"name":{}
}
}
}
聚合查询
统计
http://localhost:9200/shopping/_search
{
"aggs": {
"price_group":{
"terms":{ //分组统计
"field": "price"
}
}
}
}
求平均
http://localhost:9200/shopping/_search
{
"aggs":{
"price_avg": {
"avg":{ //求平均
"field": "price"
}
}
},
"size": 0 //原始数据的展示数量
}