ELK 8.0.0 数据增删改查
ELK 8.0.0 数据增删改查
目录
1 创建文档数据
PUT fcarey/_doc/1
{
"name":"fcarey",
"age":18,
"city":"sz",
"tag":["python","elk"]
}
PUT fcarey/_doc/2
{
"name":"user01",
"age":18,
"city":"xm",
"tag":["python","go"]
}
PUT fcarey/_doc/3
{
"name":"user02",
"age":27,
"city":"sh",
"tag":["go","php"]
}
PUT fcarey/_doc/4
{
"name":"user03",
"age":18,
"city":"sh",
"tag":["go","php","python and php"]
}
2 查找所创建的文档
# 查询fcarey索引中的所有文档
GET fcarey/_search
GET fcarey/_doc/1
# 查看当前系统中的索引
GET _cat/indices?v&s=index:asc
# 其中参数 v 全称是 verbose,表示返回详细的输出;s 参数表示进行排序(sort),形式 s=column1,column2:<desc/asc>。
/*
health: 当前健康状态
status: 开启/关闭(open/close)状态
index: 索引名称
uuid: 索引 uuid
pri: 主分片数目
rep: 副本分片数目
docs.count: 可用的文档数目
docs.deleted: 已删除的文档数目
store.size: 主分片和副本分片的存储文档空间大小
pri.store.size: 主分片的存储文档空间大小
GET _cat/indices?help
*/
3 更新文档中的数据
# 将1文档中的age字段修改为20
POST fcarey/_update/1
{
"doc": {
"age": 20
}
}
4 删除索引
PUT test/_doc/1
{
"name":"fcarey",
"age":18,
"city":"sz",
"tag":["python","elk"]
}
# 删除test索引
DELETE test
GET test/_search
5 match
5.1 match_all
# match_all是没有任何条件,检索全部数据
GET fcarey/_search
{
"query": {
"match_all": {}
}
}
5.2 match
match用来做基本的模糊匹配,在es中会对文本进行分词,在match查询的时候也会对查询条件进行分词,然后通过倒排索引找到匹配的数据。在match中支持以下参数:
- query:查询条件
- operator:匹配条件(AND、OR (Default))
- minimum_should_match:最小匹配的数量,用来指定文档中至少包含几个关键字才算匹配到
- fuzziness:最大编辑距离,详细参考Term级别查询中fuzzy查询一节的内容。
- prefix_length:通过最大编辑距离进行模糊查询额时候,开始的多少个字符不允许被模糊,默认值为0。下面有例子
- fuzzy_transpositions:boolean值,默认true,表示扩展模糊选项的时候,是否包含两个相邻字符的位置互换这种手段
- fuzzy_rewrite:可以重写查询方法,目前还没实践到,关于更多说明可以参考:rewrite parameter
- analyzer:可以指定分词器,如果不指定,用默认的
- max_expansions:参考Term级别查询中fuzzy查询一节的内容。
- zero_terms_query:在实际的文档中,可能有很多这样的词,比如中文中的的,了,呢,或者英文中的or、and、is、do等。那么这样的词对我们的搜索可能是没有任何帮助的,我们把这些的词- 叫做停用词,ES中有一个停用词分析器:Stop token filter,如果我们的查询请求的关键字中包括这些词,并且用到了这个分析器,那么他会帮我们把这些停用词移除掉。如果我们的查询请求中所有的关键字都被移除掉了,就不会匹配到任何文档,那么这个时候,是否要给用户返回一个空呢?ES提供了两种策略,也就是通过这个字段去表示的:
- none (default):不返回任何文档
- all:返回所有文档,相当于执行了match_all
- lenient:lenient有仁慈的,宽容的意思。这里表示是否忽略一些输入错误,比如为一个数字类型的字段输入了一个字符串去匹配,如果设置为true,会忽略,默认值是false
- auto_generate_synonyms_phrase_query:在有些场景,可能一个意思有两种写法,比如ElasticSearch有些人可能会写成ES,虽然写法不一样,但是描述的是一个东西,那么如果我们限定查询条件为ElasticSearch,其实也是希望能搜索到ES相关内容的。我们可以把这种词叫做同义词查询。因此ES为我们提供了这个参数,表示是否开启同义词查询,默认是true,也就是开启的。但是有一个问题就是ES他怎么知道哪些词是同义词呢?Lucene中有一个概念叫Synonym Graph Token Filter,那么ES中也是有的,我们可以通过对这个进行配置来实现同义词查询
GET fcarey/_search
{
"query": {
"match": {
"tag": "python elk"
}
}
}
5.3 match_phrase
# match_phrase(phrase: 短语) 会对输入做分词,但是需要结果中也包含所有的分词,并且顺序要求一致。这个条件其实有一点苛刻了,有时候可能我输入错了,或者一个短语,只记得其中两个单词,第三个单词死活记不起来怎么办呢?ES也提供了slop这个参数帮我们解决这个问题:slop (default 0):(slop:溢出)来指定额外加几个单词也可以命中。
GET fcarey/_search
{
"query": {
"match_phrase": {
"tag": {
"query": "python php",
"slop": 1
}
}
}
}
6 sort
POST fcarey/_update/2
{
"doc": {
"age":19
}
}
# 升序
GET fcarey/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"age": {
"order": "asc"
}
}
]
}
# 降序
GET fcarey/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
# 报错
GET fcarey/_search
{
"query": {
"match_all": {}
},
"city": [
{
"tag": {
"order": "asc"
}
}
]
}
7 分页
# 从第1个数据开始,展示两个数据
GET fcarey/_search
{
"query": {
"match_all": {}
},
"from": 0,
"size": 2
}
# 从第三个数据开始,展示两个数据
GET fcarey/_search
{
"query": {
"match_all": {}
},
"from": 2,
"size": 2
}
8 bool查询
# 查询city为sh的数据
GET fcarey/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"city": "sh"
}
}
]
}
}
}
# 查询city为sh的数据且年龄为18的人
GET fcarey/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"city": "sh"
}
},
{
"match": {
"age": "18"
}
}
]
}
}
}
# 查询city为sh的数据或年龄为18的人
GET fcarey/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"city": "sh"
}
},
{
"match": {
"age": "18"
}
}
]
}
}
}
# 查询city不为sh的数据,年龄不为18的人
GET fcarey/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"city": "sh"
}
},
{
"match": {
"age": "18"
}
}
]
}
}
}
# 查询city为sh的数据,年龄大于16小于等于20的人
GET fcarey/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"city": "sh"
}
}
],
"filter": [
{
"range": {
"age": {
"gt": 16,
"lte": 20
}
}
}
]
}
}
}
9 _source
结果过滤
# 查询city为sh的数据,年龄大于16小于等于20的人,并只返回名字与年龄。
GET fcarey/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"city": "sh"
}
}
],
"filter": [
{
"range": {
"age": {
"gt": 16,
"lte": 20
}
}
}
]
}
},
"_source": ["name","age"]
}
10 高亮
# 默认高亮
GET fcarey/_search
{
"query": {
"match": {
"city": "sh"
}
},
"highlight": {
"fields": {
"city": {}
}
}
}
# 输出
"highlight": {
"city": [
"<em>sh</em>"
]
}
# 自定义高亮
GET fcarey/_search
{
"query": {
"match": {
"city": "sh"
}
},
"highlight": {
"pre_tags": "<b style='color:red;font-size:20px;'>",
"post_tags": "</b>",
"fields": {
"city": {}
}
}
}
# 输出
"highlight": {
"city": [
"<b style='color:red;font-size:20px;'>sh</b>"
]
}
11 聚合
# 计算数据中所有成员的平均年龄
GET fcarey/_search
{
"query": {
"match_all": {}
},
"aggs": {
"my_aggs": {
"avg": {
"field": "age"
}
}
}
}
# 找出前两个数据中年龄最大的数据
GET fcarey/_search
{
"query": {
"match_all": {}
},
"aggs": {
"my_aggs": {
"max": {
"field": "age"
}
}
},
"from": 0,
"size": 2
}
12 mappings
# 获取当前索引的映射
GET fcarey/_mapping
# 默认情况下,用户可以任意新增数据字段
POST test/_doc/1
{
"name": "user01",
"age": 19
}
POST test/_doc/2
{
"name": "user02",
"age": 19,
"city":"sh"
}
POST test/_doc/3
{
"age":20,
"city":"sz"
}
# 查询当前mapping
GET test/_mapping
# 自定义mapping
PUT test
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "long"
}
}
}
}
POST test/_doc/1
{
"name":"user01",
"age":19
}
POST test/_doc/2
{
"name":"user01"
}
POST test/_doc/3
{
"name":"user01",
"age":20,
"city":"sh"
}
GET test/_search
GET test/_mapping
12.1 Elasticsearch 数据类型
Elasticsearch 可以自动检测的数据类型:
Elasticsearch data type | ||
---|---|---|
JSON data type | "dynamic":"true" |
"dynamic":"runtime" |
null |
No field added | No field added |
true or false |
boolean |
boolean |
double |
float |
double |
long |
long |
long |
object |
object |
No field added |
array |
Depends on the first non-null value in the array |
Depends on the first non-null value in the array |
string that passes date detection |
date |
date |
string that passes numeric detection |
float or long |
double or long |
string that doesn’t pass date detection or numeric detection |
text with a .keyword sub-field |
keyword |
12.2 date_detection
# 关闭日期检测 "date_detection": false
PUT test
{
"mappings": {
"date_detection": false
}
}
GET test/_mapping
PUT test/_doc/1
{
"date": "2023/09/02"
}
# data字段被创建为text类型字段
DELETE test
# 指定data字段类型
PUT test
{
"mappings": {
"dynamic_date_formats": ["MM/dd/yyyy","yyyy/MM"]
}
}
GET test/_mapping
PUT test/_doc/1
{
"date": "09/02/2023"
}
GET test/_search
DELETE test
12.3 numeric_detection
# 数字检测
PUT test
{
"mappings": {
"numeric_detection": true
}
}
put test/_doc/1
{
"num_float": "1.1",
"num_integer": "2"
}
# num_float为float类型字段
# num_integer为长整型字段
GET test/_mapping
DELETE test