基本概念
Index索引
动词:相当于Mysql中的insert;
名词:相当于Mysql中的Database;
Type类型
在Index(索引)中,可以定义一个或多个类型;
类似MySQL中的Table,每一种类型数据放在一起;
Document文档
保存在某个索引Index下,某种类型的一个数据,文档是Json格式的,Document就像是Mysql中的某个Table里面的数据;
倒排索引机制
Docker安装Elasticsearch
下载镜像文件
- docker pull elasticsearch:7.4.2
- docker pull kibana:7.4.2
//将es中配置文件挂载到外面的目录,通过修改虚拟机外面的文件夹es配置,进而修改docker中es的配置
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
//写了一个配置 http.host:0.0.0.0 代表es可以被远程的任何机器访问,注意这里host:后需要有空格
echo “http.host: 0.0.0.0”>> /mydata/elasticsearch/config/elasticsearch.yml
运行elasticsearch命令,
//为容器起一个名字为elasticsearch,-p暴露两个端口 9200 9300, 9200是发送http请求——restapi的端口,9300是es在分布式集群状态下,结点之间的通信端口, \代表换行下一行,
//-e single-node 是以单节点方式运行,ES_JAVA_OPTS不指定的话,es一启动,会将内存全部占用,整个虚拟机就卡死了,
//-v 进行挂载,目录中配置,数据等一一关联 -d 后台启动es使用指定的镜像 z
docker run --name elasticsearch -p 9200:9200 -p 9300:9300
-e “discovery.type=single-node”
-e ES_JAVA_OPTS="-Xms64m -Xmx128m"
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins
-d elasticsearch:7.4.2
安装完 elasticsearch 后我们来启动一下,会发现使用docker ps命令查看启动的容器时没有找到我们的 es,这是因为目前 es 的配置文件的权限导致的,因此我们还需要修改一下 es 的配置文件的权限:
chmod -R 777 /mydata/elasticsearch/
安装kibana
# -e : 指定环境变量配置, 提供汉化
# --like : 建立两个容器之间的关联, kibana 关联到 es
docker run -d --name kibana --link elasticsearch:elasticsearch -e "I18N_LOCALE=zh-CN" -p 5601:5601 kibana:7.4.2
# kibana 的汉化我感觉做的并不好
# 如果不习惯汉化, 可以把条件去除
docker run -d --name kibana --link elasticsearch:elasticsearch -p 5601:5601 kibana:7.8.0
初步检索
1、 _cat
GET /_cat/nodes: 查看所有节点;
GET /_cat/health: 查看Es健康状态;
GET /_cat/master: 查看主节点;
GET /_cat/indices: 查看所有索引;
进阶检索
ES支持两种基本方式检索:
- 通过使用Rest request URI 发送搜索参数(url+搜索参数)
- 通过使用Rest request body 来发送(uri+请求体)
QueryDSL
match: 全文检索;
match_parase: 短语匹配
multi_match: 多字段匹配
复合查询
GET bank/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"gender": "F"
}
},
{
"match": {
"address": "mill"
}
}
]
}
}
}
GET bank/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"gender": "M"
}
},
{
"match": {
"address": "mill"
}
}
],
"must_not": [
{
"match": {
"age": "38"
}
}
]
}
}
}
filter结果过滤
filter查询不会有相关性得分
term查询
文本查询(全文检索)使用bool;
非文本字段使用term查询;
aggregations(执行聚合)
聚合提供了从数据中心分组和提取数据的能力、最简单的聚合方法大致等于SQL中的group by和sql聚合函数。在Es中,如果有执行搜索返回hits(命中结果),并且同时返回聚合结果,把一个响应中的所有hits分隔开的能力,这是很强大的。可以执行查询和多个集合,并且在一次使用得到各自的返回结果,使用一次简介和简化的API来避免网络往返;
# 搜索address中包含mill的所有人的年龄分布以及平均年龄;
GET bank/_search
{
"query": {
"match": {
"address": "mill"
}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 10
}
},
"aggAvg":{
"avg": {
"field": "age"
}
},
"banlanceAvg":{
"avg": {
"field": "balance"
}
}
}
}
# 按照年龄聚合,并且请求这些年龄段的这些人平均薪资
GET bank/_search
{
"query": {
"match_all": {}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 100
},
"aggs": {
"ageAvg": {
"avg": {
"field": "balance"
}
}
}
}
}
}
# 先查出年龄分,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体的平均薪资
GET bank/_search
{
"query": {
"match_all": {}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 100
},
"aggs": {
"genderAgg": {
"terms": {
"field": "gender.keyword",
"size": 10
},
"aggs": {
"banlanceAvg": {
"avg": {
"field": "balance"
}
}
}
},
"ageBanlanceAgg":{
"avg": {
"field": "balance"
}
}
}
}
}
}
Mapping映射
Mapping是用来定义一个文档,以及它所包含的属性field是如何存储和索引的,比如:使用mapping来定义:
- 那些字符串属性应该被看作全文本属性;
- 那些属性包含数字、日期或者地理位置;
- 文档中的所有属性是否都能被索引(_all配置);
- 日期的格式;
- 自定义映射规则来执行动态添加属性;
添加索引映射
## 创建一个新的索引并指定属性类型
PUT /my_index
{
"mappings": {
"properties": {
"age": {"type": "integer"},
"email": {"type": "keyword"},
"name": {"type": "text"}
}
}
}
## 对已有索引添加一个字段映射
PUT /my_index/_mapping
{
"properties": {
"employee-id": {
"type":"keyword",
"index":false
}
}
}
分词
一个tokenizer(分词器)接收一个字符流,将之分隔为独立的tokens(词元,通常是独立的单词),然后输出tokens流。
安装IK中文分词器
docker安装Nginx
// 在/mydata 目录下面创建nginx
mkdir nginx
// 本地没有找到镜像,自动去远程下载
docker run -p 80:80 --name nginx -d nginx:1.10
docker container cp nginx:/etc/nginx .
docker stop nginx
docker rm nginx
// 切换到mydata后 把nginx改名字为conf
mv nginx conf
mkdir nginx
// 把整个文件夹移动到 nginx下,以后nginx就在conf下面了
mv conf nginx/
注意,\前面是有空格的
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.10