# es-note **Repository Path**: zy0912/es-note ## Basic Information - **Project Name**: es-note - **Description**: elasticsearch 笔记 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-11-07 - **Last Updated**: 2024-06-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## es笔记 ### 安装 #### 下载镜像文件 ```bash docker pull elasticsearch:7.4.2 # 存储和检索数据 docker pull kibana:7.4.2 # 可视化检索数据 ``` #### 创建实例 ```bash mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data # 写入配置 echo "http.host : 0.0.0.0">>/mydata/elasticsearch/config/elasticsearch.yml # 保证权限问题 chmod -R 777 /mydata/elasticsearch/ # 创建es容器实例 docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xms128m" -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 # 创建kibana容器实例 docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.0.208:9200 -p 5601:5601 -d kibana:7.4.2 ``` ### 初步检索 #### _cat ```txt GET /_cat/nodes 查看所有节点 GET /_cat/health 查看健康状况 GET /_cat/master 查看主节点信息 GET /_cat/indices 查看所有索引 show databases; ``` #### 保存文档 ```txt POST /索引名/类型名/{唯一标识} ``` 带id是更新,不带id则是新增 ![image-20231108141001527](images/image-20231108141001527.png) #### 查询文档 ```txt GET /索引名/类型名/唯一标识 ``` ![image-20231108134121277](images/image-20231108134121277.png) 结果分析 ```json { "_index": "customer", // 在哪个索引 "_type": "external", // 在哪个类型 "_id": "1", // 记录ID "_version": 2, // 版本号 "_seq_no": 1, // 并发控制字段,每次更新就会+1,用来做乐观锁 "_primary_term": 1, // 同上,主分片重新分配,如重启,就会变化 "found": true, "_source": { // 真正的内容 "name": "john Doe" } } ``` #### 更新文档 ```txt PUT /索引名/类型名/唯一标识 ``` 第一次发送是新增操作 ![image-20231108132938725](images/image-20231108132938725.png) 多次发送为更新 ![image-20231108133210271](images/image-20231108133210271.png) ##### post带_update 如果与原数据一样则不更新 ```txt POST /索引名/类型名/唯一标识/_update ``` ![image-20231108140457449](images/image-20231108140457449.png) 带_update参数格式必须有doc ```json { "doc": { } } ``` ##### 乐观锁更新 ```txt PUT /索引名/类型名/唯一标识?if_seq_no=1&if_primary_term=1 ``` #### 删除文档&索引 ```txt DELETE /索引名/类型名/唯一标识 DELETE /索引名/类型名/ ``` #### bulk 批量 API ```txt POST /索引名/类型名/_bulk ``` ![image-20231108142015013](images/image-20231108142015013.png) ##### 复杂用法 官方样本数据:[github.com (raw.githubusercontent.com)](http://raw.githubusercontent.com/elastic/elasticsearch/7.4/docs/src/test/resources/accounts.json) ![image-20231108143727520](images/image-20231108143727520.png) ### 进阶检索 #### SearchAPI ```txt GET bank/_search?q=*&sort=account_number:asc # 参数方式检索 GET bank/_search # 检索所有信息 { "query": { "match_all": {} }, "sort": [ { "account_number": "asc", "balance": "desc" } ], "from": 10, "size": 10 } ``` #### Query DSL ##### match_all 查询全部 ```json GET bank/_search { "query": { "match_all": {} }, "sort": [ { "balance": "desc" } ], "from": 0, "size": 20, "_source": ["balance","account_number"] } ``` ![image-20231113130600186](images/image-20231113130600186.png) ##### match分词匹配 全文检索按照评分进行排序,会对检索条件进行分词匹配。如果是非字符串则是精准搜索 ```json GET bank/_search { "query": { "match": { "address": "mill lane" } } } ``` ![image-20231113131157785](images/image-20231113131157785.png) ##### match_phrase 不分词匹配 将需要匹配的值当成一个整体单词(不分词)进行检索 ```json GET bank/_search { "query": { "match_phrase": { "address": "mill lane" } } } ``` ![image-20231113131126144](images/image-20231113131126144.png) ##### multi_match 多字段匹配 会对检索条件进行分词匹配 ```json GET bank/_search { "query": { "multi_match": { "query": "mill movico", "fields": ["address", "city"] } } } ``` ![image-20231113131808331](images/image-20231113131808331.png) ##### wildcard 模糊匹配 ```json GET /my_index/_search { "query": { "wildcard": { "field_name": "*value*" } } } ``` ##### bool 复合查询 must 一定要满足 must_not 一定不满足 should 满足条件的得分会高一些 filter 没有相关性得分,且不满足会直接过滤 ```json GET bank/_search { "query": { "bool": { "must": [ { "match": { "gender": "M" } } ], "must_not": [ { "match": { "age": "28" } } ], "should": [ { "match": { "lastname": "Wallace" } } ], "filter": { "range": { "age": { "gte": 18, "lte": 30 } } } } } } ``` ![image-20231113135016502](images/image-20231113135016502.png) ##### term 非文本类型精确匹配 可以用于检索精确值,例如整形类型的数据 ```json GET bank/_search { "query": { "term": { "age": "28" } } } ``` ![image-20231113135002784](images/image-20231113135002784.png) ##### 文本类型精确匹配 ```json GET bank/_search { "query": { "match": { "address.keyword": "mill lane" } } } ``` ![image-20231113134926656](images/image-20231113134926656.png) ##### aggregations 聚合 - 搜索address中包含mill的所有人的年龄发布以及平均年龄,但不显示这些人的详情 ```json ## 搜索address中包含mill的所有人的年龄发布以及平均年龄,但不显示这些人的详情 GET bank/_search { "query": { "match": { "address": "mill" } }, "aggs": { "ageAgg": { "terms": { "field": "age", // 只取前10个分布 "size": 10 } }, "ageAvg": { // 平均值 "avg": { "field": "age" } } }, // 分页,不要任何结果 "size": 0 } ``` - 按照年龄聚合,并且请求这些年龄段的这些人的平均薪资 ```json ## 按照年龄聚合,并且请求这些年龄段的这些人的平均薪资 GET bank/_search { "query": { "match_all":{} }, "aggs": { "ageAgg": { "terms": { "field": "age", "size": 100 }, "aggs": { "balanceAvg": { "avg": { "field": "balance" } } } } }, "size": 0 } ``` - 查出所有年龄发布,并且这些年龄中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资 ```json ## 查出所有年龄发布,并且这些年龄中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资 GET bank/_search { "query": { "match_all":{} }, "aggs": { "ageAgg": { "terms": { "field": "age", "size": 100 }, "aggs": { "genderAgg": { "terms": { "field": "gender.keyword" }, "aggs": { "balanceAvg": { "avg": { "field": "balance" } } } } } } }, "size": 0 } ``` ##### 分词分析 ```txt GET bank/_analyze { "field": "spec", "text": "充电器-72V7.5A(反插,C型,三针,低电平,快充)", "analyzer": "english" } ``` ![image-20240613152405034](./assets/image-20240613152405034.png)