介绍
特点
ES 是基于Lucence编写的开源分布式搜索引擎,它有以下几个特点
- lucence:底层搜索引擎
- 分布式:横向可扩展能力
- 全文检索:将一段词语进行分词,并将分出的词语统一的放在一个分词库中,再搜索时,根据关键字取分词库中检索,找到匹配的内容(倒排索引)。
概念
ES使用倒排索引来检索数数据。类比:书本(index)–>小说|散文|杂志(type)–>书里面的一行一行内容(document)–> 字|词组|句子(filed)
-
Index索引:es里面使用的倒排索引来检索数据,所以我们这里有个索引的概念,它有2个含义,一个可以理解为代表倒排索引,一个为“索引数据”即存储数据到es里面(会经过倒排索引这个步骤)。
-
type类型
- 5.x 版本一个index下可以有多个type
- 6.x 版本一个index下只可以有一个type
- 7.x 版本,index里面没有type
-
document文档,实质存储的内容,类比mysql表里面的row
-
filed 字段:文档里面字段,类比mysql 每个表里面的字段field。
查询步骤
-
将存放的数据以一定的方式进行分词,并将分词的内容存放到一个单独的分词库中。
-
当用户取查询数据时,会将用户的查询关键字进行分词,然后去分词库中匹配内容,最终得到数据的id标识
-
根据id标识去存放数据的位置拉去指定数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mb3ueaGQ-1602215594343)(Elasticsearch%E7%AE%80%E4%BB%8B/es%E6%A3%80%E7%B4%A2%E6%B5%81%E7%A8%8B.png)]
对比solr
-
solr 查询死数据,速度比es快。但是数据如果是改变的,solr查询速度会降低很多,ES的查询速度没有明显的改变
-
solr搭建集群 依赖ZK,ES本身就支持集群搭建
-
最开始solr 的社区很火爆,针对国内文档 少,ES出现后,国内社区火爆程度 上升,,ES的文档非常健全
-
ES对云计算和大数据支持很好
ES 安装
docker-compose 安装
编写docker-compose.yml
version: "3.1"
services:
elasticsearch:
image: daocloud.io/library/elasticsearch:6.5.4
restart: always
container_name: elasticsearch
ports:
- 9200:9200
kibana:
image: daocloud.io/library/kibana:6.5.4
restart: always
container_name: kibana
ports:
- 9200:9200
environment:
- elasticsearch_url=http://127.0.0.1:9200
depends_on:
- elasticsearch
官网下载
- elasticsearch :https://www.elastic.co/downloads/past-releases/elasticsearch-6-5-4
- kibana: https://www.elastic.co/downloads/past-releases/kibana-6-5-4
Elasticsearch 基本操作
restful语法
GET请求:
http://ip:port/index :查询索引信息
http://ip:port/index/type/doc_id :查询指定的文档信息
POST请求:
http://ip:port/index/type/_search: 查询文档,可以在请求体中添加json字符串来代表查询条件
http://ip:port/index/type/doc_id/_update: 修改文档,在请求体中添加json字符串来代表修改的信息
PUT请求:
http://ip:port/index : 创建一个索引,需要在请求体中指定索引的信息
http://ip:port/index/type/_mappings:代表创建索引时,指定索引文档存储属性的信息
DELETE 请求:
http://ip:port/index: 删除跑路
http://ip:port/index/type/doc_id: 删除指定的文档
Kibana 中操作
我们主要关注Kibana中的Dev Tools(操作es) 和Mangement(查看索引信息)
增删改查
- 新建索引不指定mapping
#number_of_shards 分片
#number_of_replicas 备份
PUT /person
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
}
}
- 新建索引并指定mapping
#创建索引,指定数据类型
PUT /book
{
"settings": {
#分片数
"number_of_shards": 5,
#备份数
"number_of_replicas": 1
},
#指定数据类型
"mappings": {
#类型 Type
"novel":{
#文档存储的field
"properties":{
#field属性名
"name":{
#类型
"type":"text",
#指定分词器
"analyzer":"ik_max_word",
#指定当前的field可以被作为查询的条件
"index":true,
#是否需要额外存储
"store":false
},
"author":{
"type":"keyword"
},
"count":{
"type":"long"
},
"on-sale":{
"type":"date",
#指定时间类型的格式化方式
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"descr":{
"type":"text",
"analyzer":"ik_max_word"
}
}
}
}
}
- 查询索引
GET /person
-
更新索引
#number_of_shards 分片 #number_of_replicas 备份 PUT /person { "settings": { "number_of_shards": 5, "number_of_replicas": 1 } }
-
删除索引
DELETE /person
Filed 类型
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/mapping-types.html
字符串类型:
text: 一般用于全文检索,将当前field 进行分词
keyword:当前field 不会进行分词
数值类型:
long:
Intger:
short:
byte:
double:
float:
half_float: 精度比float 小一半
scaled_float:根据一个long 和scaled 来表达一个浮点型 long-345, -scaled 100 ->3.45
时间类型:
date类型,根据时间类型指定具体的格式
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"date": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
}
布尔类型:
boolean 类型,表达true 和false
二进制类型:
binary类型暂时支持Base64编码的字符串
范围类型:
integer_range:
float_range:
long_range:赋值时,无需指定具体的内容,只需存储一个范围即可,gte,lte,gt,lt,
double_range:
date_range:
ip_range:
PUT range_index
{
"settings": {
"number_of_shards": 2
},
"mappings": {
"_doc": {
"properties": {
"expected_attendees": {
"type": "integer_range"
},
"time_frame": {
"type": "date_range",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
}
PUT range_index/_doc/1?refresh
{
"expected_attendees" : {
"gte" : 10,
"lte" : 20
},
"time_frame" : {
"gte" : "2015-10-31 12:00:00",
"lte" : "2015-11-01"
}
}
经纬度类型:
geo_point:用来存储经纬度
IP类型:
ip:可以存储IPV4 和IPV6
其他的数据类型,参考官网
文档操作
- 新建
自动生成id
#添加文档,自动生成id
POST /book/novel
{
"name":"盘龙",
"author":"我吃西红柿",
"count":100000,
"on-sale":"2001-01-01",
"descr":"大小的血睛鬃毛狮,力大无穷的紫睛金毛猿,毁天灭地的九头蛇皇,携带着毁灭雷电的恐怖雷龙……这里无奇不有,这是一个广博的魔幻世界。强者可以站在黑色巨龙的头顶遨游天际,恐怖的魔法可以焚烧江河,可以毁灭城池,可以夷平山岳……"
}
#添加文档,手动指定id
PUT /book/novel/1
{
"name":"红楼梦",
"author":"曹雪芹",
"count":10000000,
"on-sale":"2501-01-01",
"descr":"中国古代章回体长篇小说,中国古典四大名著之一,一般认为是清代作家曹雪芹所著。小说以贾、史、王、薛四大家族的兴衰为背景,以富贵公子贾宝玉为视角,以贾宝玉与林黛玉、薛宝钗的爱情婚姻悲剧为主线,描绘了一批举止见识出于须眉之上的闺阁佳人的人生百态,展现了真正的人性美和悲剧美"
}
- 修改
#修改文档,使用doc 方式
POST /book/novel/1/_update
{
"doc":{
#指定需要修改的field和对应的值
"count":566666
}
- 删除
#根据id删除文档
DELETE /book/novel/3mEnk3MBaSKoGN4T2olw