es的语法操作命令
Posted 小徐敲java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了es的语法操作命令相关的知识,希望对你有一定的参考价值。
查询
#查询索引
GET person
#查询全部索引的状态数据
GET /_cat/indices?v
#查询
GET http://ip:端口/索引名称 # 查询单个索引信息
GET http://ip:端口/索引名称1,索引名称2... # 查询多个索引信息
GET http://ip:端口/_all # 查询所有索引信息
#查询映射
GET person1/_mapping
#查询文档,指定id
GET /person/_doc/1
#查询所有文档
GET /person/_search
添加
#添加
PUT http://ip:端口/索引名称
#创建索引并添加映射(推荐)
PUT /person1
"mappings":
"properties":
"name":
"type": "text"
,
"age":
"type": "integer"
#添加字段
PUT /person1/_mapping
"properties":
"name":
"type": "text"
,
"age":
"type": "integer"
#添加文档,指定id
POST /person/_doc/1
"name":"张三",
"age":18,
"address":"北京"
#添加文档,不指定id
POST /person1/_doc/
"name":"张三",
"age":18,
"address":"北京"
#字段"tel"不可以进行查询,不然会报错只因创建映射时"tel"的"index"为false
"user":
"mappings":
"properties":
"name":
"type": "text"
,
"sex":
"type": "keyword"
,
"tel":
"type": "keyword",
"index": false
修改
#局部更新
POST /user/_update/4
"doc":
"email":"88886"
#全量更新,存在就更新,不存在就创建
POST /user/_doc/4
"name" : "王九",
"sex" : "男性",
"tel" : "99"
删除
#删除索引
DELETE http://ip:端口/索引名称
#删除指定id文档
DELETE /person/_doc/1
#删除某个文档中的属性
POST user/_doc/1/_update
"script" : "ctx._source.remove('new_field')"
高级ur路径查询
#查询name端包含王或者九的
GET /user/_search?q=name:王九
#URL带参数形式查询,这很容易让不善者心怀恶意,或者参数值出现中文会出现乱码情况。为了避免这些情况,我们可用使用带JSON请求体请求进行查询
高级查询term
#term是代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词拆解
GET user/_search
"query":
"term":
"FIELD":
"value": "VALUE"
#terms里的[ ] 多个是或者的关系,只要满足其中一个词就可以
GET user/_search
"query":
"terms":
"FIELD": [
"VALUE1",
"VALUE2"
]
#terms里的[ ] 多个是或者的关系,只要满足其中一个词就可以。想要通知满足两个词的话,就得使用bool的must来做
GET user/_search
"query":
"bool":
"must": [
"term":
"FIELD":
"value": "VALUE"
,
"term":
"FIELD":
"value": "VALUE"
]
高级查询match
#查找所有文档内容
GET user/_search
"query":
"match_all":
# 查询全部文档指定字段
GET user/_search
"query":
"match_all":
,
"_source":["FIELD"]
#match进行搜索的时候,会先进行分词拆分,拆完后,再来匹配
GET user/_search
"query":
"match":
"FIELD": "TEXT"
#match_phrase 称为短语搜索,要求所有的分词必须同时出现在文档中,同时位置必须紧邻一致
GET user/_search
"query":
"match_phrase":
"FIELD": "PHRASE"
# 上面的 MatchQuery 有一个短板,假如用户输入了某关键字,我们在查找的时候并不知道他输入的是 name 还是 description,这时我们用什么都不合适,而 MultiQuery 的出现解决了这个问题,他可以通过 fields 属性来设置多个域联合查找
GET user/_search
"query":
"multi_match":
"query": "Spring开发",
"minimum_should_match": "70%",
"fields": ["name", "description"]
范围查询
多条件查询,must相当于数据库的&&,should相当于数据库的||
#must相当于数据库的&&
GET user/_search
"query":
"bool":
"must":[
"match":
"name":"小王"
,
"match":
"age":18
]
#should相当于数据库的||
GET user/_search
"query":
"bool":
"should":[
"match":
"name":"小王"
,
"match":
"age":18
]
分页查询
GET user/_search
"query":
"match_all":
,
"from":0,
"size":2
查询排序
"query":
"match_all":
,
"sort": [
"age":
"order": "desc"
]
范围查询
GET user/_search
"query":
"bool":
"should":[
"match":
"name":"小王"
,
"match":
"age":18
],
"filter": [
"range":
"age":
"gte": 10,
"lte": 20
]
全文检索
"query":
"match":
"name" : "王妹"
高亮查询,高亮展示的数据,本身就是文档中的一个field,单独将field以highlight的形式返回给你。
ES提供了一个highlight属性,和query同级别的
GET user/_search
"query":
"match_phrase":
"name": "张三"
,
"highlight":
"fields":
"name":
,
"pre_tags": "<font color='red'>",
"post_tags": "</font>",
"fragment_size": 10
fragment_size :指定高亮数据展示多少个字符回来;
pre_tag:指定前缀标签,如 < font color=“red”>
post_tags:指定后缀标签,如 < /font>
field:指定那个字段为高亮字段
分组查询
GET user/_search
"aggs":
"gg_gl":
"terms":
"field": "age"
,
"size": 0
高级映射嵌套**【字段type设置为keyword就不会被分词】
#嵌套节点下面新增字段
PUT /user/_mapping
"properties":
"school":
"type": "keyword",
"norms": false,
"doc_values": false
,
"teacher":
"type": "nested",
"properties":
"rightStatus":
"type": "keyword",
"norms": false,
"doc_values": false
,
"rightCurrTime":
"type": "keyword",
"norms": false,
"doc_values": false
#关闭、打开索引(关闭索引是为了释放内存,将数据持久化到硬盘,不可读写已经关闭的索引)
POST http://ip:端口/索引名称/_close
POST http://ip:端口/索引名称/_open ```
IK分词器有两种分词模式:ik_max_word和ik_smart模式
linux系统安装分词器,首先docker安装es
进入到es
docker exec -it elasticsearch /bin/bash
执行安装ik分词器(注意安装的分词器需要与es版本一直,不一致更改一下ik分词器的版本号)
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.0/elasticsearch-analysis-ik-7.12.0.zip
安装成功后,可以再宿主机es挂卷的plugin下看到ik文件,然后必定要重启es容器
docker restart elasticsearch
在kibana上操作,查看分词器结果**【注意如是是英文字母大写,使用默认分词器分词后都会变成小写】
GET /_analyze
"analyzer": "ik_smart",
"text": "东哥是前端大佬"
#结果
"tokens" : [
"token" : "东",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
,
"token" : "哥",
"start_offset" : 1,
"end_offset" : 2,
"type" : "CN_CHAR",
"position" : 1
,
"token" : "是",
"start_offset" : 2,
"end_offset" : 3,
"type" : "CN_CHAR",
"position" : 2
,
"token" : "前端",
"start_offset" : 3,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 3
,
"token" : "大佬",
"start_offset" : 5,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 4
]
ES数据类型
聚合:相当于mysql 中的sum(求和)
text:会分词,不支持聚合
keyword:不会分词,将全部内容作为一个词条,支持聚合
integer:数值类型
boolean:布尔
binary:二进制
integer_range, float_range, long_range, double_range, date_range :范围类型
date:日期
[ ] Nested: nested (for arrays of JSON objects 数组类型的JSON对象):数组
Object: object(for single JSON objects 单个JSON对象):对象
GET:用来获取资源
POST:用来新建资源(也可以用于更新资源)
PUT:用来更新资源
DELETE:用来删除资源
- ES 5.x中一个index可以有多种type。
- ES 6.x中一个index只能有一种type。
- ES 7.x以后,将逐步移除type这个概念,现在的操作已经不再使用,默认_doc
#查看索引下的字段映射,es版本为7的可使用一下命令,在mapping?后加上format=json&include_type_name=true
GET /user/_doc/_mapping?format=json&include_type_name=true
以上是关于es的语法操作命令的主要内容,如果未能解决你的问题,请参考以下文章