前言
本系列主要是记录ElasticSearch7.x(后面简称ES)的学习过程,整个学习过程尽量覆盖ES大多数知识点。
安装
本文主要是介绍Elasticsearch开发相关技术,所以只介绍用Docker部署这一种方式,简单便捷,对机器无污染。一般企业生产使用的话都会使用各种云服务,基本无需自行从零部署。
- 安装Elasticsearch
docker network create elastic
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.13.1
docker run -d --name es01-test --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.13.1
- 安装可视化工具Kibana
docker pull docker.elastic.co/kibana/kibana:7.13.1
docker run -d --name kib01-test --net elastic -p 5601:5601 -e "ELASTICSEARCH_HOSTS=http://es01-test:9200" docker.elastic.co/kibana/kibana:7.13.1
安装ES完毕之后,首先验证下是否安装成功。
使用curl工具在命令性进行验证
curl -X GET localhost:9200/
控制台返回以下类似信息即代表安装成功
{
"name" : "5076a4eb3bce",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "sLVGvsBkQ52vwbOFfkWSFw",
"version" : {
"number" : "7.13.1",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "9a7758028e4ea59bcab41c12004603c5a7dd84a9",
"build_date" : "2021-05-28T17:40:59.346932922Z",
"build_snapshot" : false,
"lucene_version" : "8.8.2",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
接下来在浏览器访问,成功进入kibana界面即可。可以使用Dev tools进行和ES的调用交互
http://localhost:5601/
到这里,es和kibana已经基本安装完毕。
基本概念
Node与Cluster
ES是一个分布式数据库,允许多服务协同工具,每台服务器可以有多个es实例
一个实例成为一个节点(Node),多个节点构成一个集群(Cluster)
Index
ES数据管理的最顶层单位就作Index(索引),相当于Mysql的"数据库"。每个Index的名字必须是小写
下面的命令可以查看当前节点的所有Index
curl -X GET 'localhost:9200/_cat/indices?v'
Document
Index里面单条记录称为Document(文档)。多条Document构成一个Index
Document使用JSON格式表,例子。
{
"user": "Javis",
"title": "架构师",
"desc": "基础架构部管理"
}
Type(7.x已彻底移除)
Type在7.x已彻底移除,由于在最初的时候,ES把Index类比成SQL中的“库”,而Type类比成“表”。
这其实是一个错误的假设,在SQL中,表是相互独立的,一个表中的列与另一个表中同名的列没有任何关系。可对于ES来说,并非如此。
在ES中,相同名称的Field在Lucene底层被认为是同一个Field,在某些情况下回导致Lucene效率下降。
基本操作
新建和删除Index
新建Index,可以直接向ES Server发出PUT请求。下面的例子是新建一个名叫school的Index
curl -X PUT 'localhost:9200/school'
服务器返回一个JSON对象,里面的ackownledged字段标识操作成功
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "school"
}
接着,我们使用DELETE请求删除这个Index
curl -X DELETE 'localhost:9200/school'
同样,ackownledged告诉我们删除成功
{
"acknowledged": true
}
数据操作
新增记录
向指定的Index发送 POST or PUT请求以下命令,就可以新增一条记录。下面我们就往shcool这个Index中插入一条记录。
curl -X POST -H 'Content-Type: application/json' localhost:9200/school/_doc/002 -d '
{
"user": "Javis"
}'
school/_doc后面的_doc,这个是es7.x替代Type的语法。
服务器返回JSON对象,会给出Index、Id、Version等信息。
{
"_index" : "school",
"_type" : "_doc",
"_id" : "001",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 7,
"_primary_term" : 1
}
可以看到,school/_doc/002后面的002表示该条记录的Id。它可以是数字也可以是任意字符串。
新增记录的时候可以不指定Id。
curl -X POST -H 'Content-Type: application/json' localhost:9200/school/_doc -d '
{
"user": "Kitty"
}'
可以看到服务端返回的_id是一个随机字符串
{
"_index": "school",
"_type": "_doc",
"_id": "FoZ3DnoBrntj5fJoj9X6",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 10,
"_primary_term": 1
}
查看记录
向Index发出GET请求,就可以查看指定记录。
curl -X GET 'localhost:9200/school/_doc/001?pretty=true'
URL的参数pretty=true表示格式化返回参数。
found字段表示搜索成功,_source字段返回原始记录
{
"_index" : "school",
"_type" : "_doc",
"_id" : "001",
"_version" : 1,
"_seq_no" : 7,
"_primary_term" : 1,
"found" : true,
"_source" : {
"user" : "Javis"
}
}
更新记录
更新记录就是使用PUT请求,重新发送一次数据
curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/school/_doc/001' -d \
'{
"user": "JavisChen"
}'
上面的代码中,把原始数据从"Javis"修改为"JavisChen"
删除记录
发出DELETE请求删除记录。
curl -X DELETE 'localhost:9200/school/_doc/001'
数据查询
返回所有数据
使用GET方式,直接请求/shcool/_doc/_search,就会返回所有数据
curl -X GET 'localhost:9200/school/_doc/_search?pretty=true
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 10,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "school",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"user" : "张老师3",
"title" : "普通老师",
"desc" : "语文系"
}
}
]
}
}
返回结果中字段含义:
took表示耗时(毫秒)
timed_out表示是否超时
hits表示命中的记录。
total返回记录数
max_score最高的匹配度
hits返回的记录数组
全文搜索
ES的查询是有自己的查询语法,要求GET请求带上Body
curl -X GET -H 'Content-Type:application/json' 'localhost:9200/school/_doc/_search?pretty=true' -d \
'{
"query": {"match": {"user": "kk"}}
}'
上面使用Match查询,指定user字段里面包含"kk"。返回结果如下。
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 3.0244193,
"hits" : [
{
"_index" : "school",
"_type" : "_doc",
"_id" : "F4aQDnoBrntj5fJottUb",
"_score" : 3.0244193,
"_source" : {
"user" : "kk"
}
}
]
}
}
ES默认一次返回10条记录,可以使用size来调整这个设定,还可以使用from进行位移。from默认从0开始。
curl -X GET -H 'Content-Type:application/json' 'localhost:9200/school/_doc/_search?pretty=true' -d \
'{
"query": {"match": {"user": "kk"}},
"from": 0,
"size": 20
}'
逻辑运算
多个搜索关键字以空格分开,代表or关系
curl -X GET -H 'Content-Type:application/json' 'localhost:9200/school/_doc/_search?pretty=true' -d \
'{
"query": {"match": {"user": "kk javis"}},
"from": 0,
"size": 20
}'
上面请求搜索的是kk or javis
如果要执行多个关键字的and搜索,必须使用布尔查询
GET /school/_doc/_search
{
"query": {
"bool": {
"must": [
{"match":{"user":"kk"} },
{"match":{"user":"javis"} }
]
}
},
"from": 0,
"size": 20
}