ElasticSearch 安装与入门

自牧 Lv1

入门安装

坑点:

  • linux内存要预留够,不然进程会挂,elasticsearch建议内存要512m,kibana同
  • 安装<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">Kibana</font>的版本一定要跟ElaticSearch的版本是一样的,这样才不会容易出问题

参考文档

使用docker部署

记得kibana的ELASTICSEARCH_HOSTS设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//es
docker run -d \
--name es \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-v es-data:/usr/share/elasticsearch/data \
-v es-plugins:/usr/share/elasticsearch/plugins \
--privileged \
--network hm-net \
-p 9200:9200 \
-p 9300:9300 \
elasticsearch:7.12.1
//kibana
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=hm-net \
-p 5601:5601 \
kibana:7.12.1

基本概念

ES同mysql进行对比来学习

MySQL Elasticsearch 说明
Table Index 索引(index),就是文档的集合,类似数据库的表(table)
Row Document 文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式
Column Field 字段(Field),就是JSON文档中的字段,类似数据库中的列(Column)
Schema Mapping Mapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema)
SQL DSL DSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD

ES的语法都是基于http请求和json

  • 创建、修改PUT
  • 修改POST
  • 获取GET
  • 修改PUT
  • 删除DELETE

es的数据结构是基于Index索引库,其内一个个字段含义与mysql的colomn差不多

Index(索引库)基本语法

type:字段数据类型,常见的简单类型有:

  • 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
  • 数值:longintegershortbytedoublefloat
  • 布尔:boolean
  • 日期:date
  • 对象:object

新建索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PUT /user(索引名)
{
"mappings": {
"properties": {
"字段名":{
"type": "text",
"analyzer": "ik_smart" //分词器
},
"字段名": {
"type": "object"
"properties": { //子字段对象
"字段名":{
"type": "float",
},
}
}
}
}
}

获取索引

1
GET /索引库名

更新索引库信息

要点:只能添加字段,不能修改、删除字段,更新成功返回的是UPDATED

1
2
3
4
5
6
7
8
9
10
11
PUT /索引库名
{
"mappings": {
"properties": {
"字段名": {
"type": "text"
}
}
}
}

删除索引库

1
DELETE /索引库名

Doc基本语法

无非是增删查改

新增文档

1
2
3
4
5
6
7
8
9
POST /索引库名/_doc/文档id
{
"字段1": "值1",
"字段2": "值2",
"字段3": {
"子属性1": "值3",
"子属性2": "值4"
},
}
1
2
3
4
5
6
7
8
9
POST /heima/_doc/1
{
"info": "Java",
"email": "xxxx@163.com",
"name": {
"firstName": "云",
"lastName": "赵"
}
}

更新文档

更新文档分为全量更新和根据字段更新,全量更新就是覆盖旧的文档,字段更新就是只更新写的字段

1
2
3
4
5
6
7
8
9
POST /索引库名/_doc/文档id
{
"字段1": "值1",
"字段2": "值2",
"字段3": {
"子属性1": "值3",
"子属性2": "值4"
},
}
1
2
3
4
5
PUT /索引库名/_update/文档id
{
"更新字段1": "值1",
"更新字段2": "值2"
}

获取文档

1
GET /索引库名/_doc/文档id 

删除文档

1
DELETE /索引库名/_doc/文档id

批处理

批处理采用POST请求

  • 添加index,create
    • _index: 索引库名
    • _id: 文档id
    • filed: 字段名
    • value: 值
  • 删除delete
    • _index: 索引库名
    • _id: 文档id
  • 更新update
    • _index: 索引库名
    • _id: 文档id
    • filed: 更新字段名
    • value: 更新值

基本语法如下:

1
2
3
4
POST _bulk
{"index": {"_index": "索引库名", "_id": "1"}}
{"filed": "value"}

DSL查询

叶子查询

语法为GET /索引库名/_search

  • 全文检索查询(分词)
    • match_all 查询全部
    • match 根据输入内容分词搜索
  • 精确查询
    • term 按字段查询
    • ids 给定id列表
    • range 数值范围
  • 地理查询
    • geo_bounding_box:按矩形搜索
    • geo_distance:按点和半径搜索

全文检索

1
2
3
4
5
6
7
8
GET /{索引库名}/_search
{
"query": {
"match": {
"字段名": "搜索条件"
}
}
}

精确查询

1
2
3
4
5
6
7
8
GET /{索引库名}/_search
{
"query": {
"term": {
"字段名": "匹配值"
}
}
}
1
2
3
4
5
6
7
8
GET /{索引库名}/_search
{
"query": {
"ids": {
"values": ["1","2","3"]
}
}
}

range: gt大于,lt小于,gte大于等于,lte小于等于

1
2
3
4
5
6
7
8
9
GET /{索引库名}/_search
{
"query": {
"range": {
"gte": 100,
"lte": 1000
}
}
}

地理查询

不会,先不写

复合查询

复合查询大致可以分为两类:

  • 第一类:基于逻辑运算组合叶子查询,实现组合条件,例如
    • bool
  • 第二类:基于某种算法修改查询时的文档相关性算分,从而改变文档排名。例如:
    • function_score
    • dis_max

其它复合查询及相关语法可以参考官方文档:

https://www.elastic.co/guide/en/elasticsearch/reference/7.12/compound-queries.html

bool

bool可以填写的内容为:

  • must,必须满足,相当于and
  • should,可以满足,相当于或
  • must not,必须不满足,不参与算分
  • filter 过滤,必须匹配,不参与算分,筛选条件用这个

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
GET /items/_search
{
"query": {
"bool": {
"must": [
{"match": {"name": "手机"}}
],
"should": [
{"term": {"brand": { "value": "vivo" }}},
{"term": {"brand": { "value": "小米" }}}
],
"must_not": [
{"range": {"price": {"gte": 2500}}}
],
"filter": [
{"range": {"price": {"lte": 1000}}}
]
}
}
}

算分函数查询

现在用不到,先跳过

数据聚合

聚合常见的有三类:

  • 桶(**Bucket**聚合:用来对文档做分组
    • TermAggregation:按照文档字段值分组,例如按照品牌值分组、按照国家分组
    • Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组
  • 度量(**Metric**聚合:用以计算一些值,比如:最大值、最小值、平均值等
    • Avg:求平均值
    • Max:求最大值
    • Min:求最小值
    • Stats:同时求maxminavgsum
  • 管道(**pipeline**聚合:其它聚合的结果为基础做进一步运算

注意:参加聚合的字段必须是keyword、日期、数值、布尔类型

桶聚合

1
2
3
4
5
6
7
8
9
10
11
12
GET /{索引库名}/_search
{
size: 0, //如不需要文档将size置为0不占空间
aggs: {
"agg_name": {
"term": {
"field": "字段名",
"size": "聚合多少数据"
}
}
}
}

过滤聚合数据

要给聚合数据加条件的话加个query

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
GET /{索引库名}/_search
{
"query": {
"bool": {
"must": [
{"term": {"field": "字段名" }}
]
}
},
size: 0, //如不需要文档将size置为0不占空间
aggs: {

"agg_name": {
"term": {
"field": "字段名",
"size": "聚合多少数据"
}
}
}
}

度量聚合

当桶运算把数据聚合到一起后就可以用Metric聚合把数据进行运算

Avg:求平均值

Max:求最大值

Min:求最小值

Stats:同时求maxminavgsum

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
GET /{索引库名}/_search
{
size: 0, //如不需要文档将size置为0不占空间
aggs: {
"price_agg": {
"term": {
"field": "字段名",
"size": "聚合多少数据"
},
"aggs":{ //嵌套一个聚合
"price_stats": {
{"stats": {"field": "price" }}
}
}
}
}
}
  • Title: ElasticSearch 安装与入门
  • Author: 自牧
  • Created at : 2024-08-26 20:08:36
  • Updated at : 2025-04-14 15:38:30
  • Link: https://www.zimucode.top/2024/08/26/ElasticSearch/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments