本文,本文重在扫盲,从简单的添加索引、创建mapping、增、删、改、查、分页、聚合、嵌套查询等常用的语法切入,把大家带入到Elastic search的使用,让我们对es有个大概的体感。

目录

一、添加索引

二、设置mapping

属性映射类型可参考:

示例

三、插入数据

四、查询数据

以上mapping的设置,涵盖了四种常用的数据类型。对每种数据类型查询做下分析

1.简单数据类型:如上述示例中的goodsId,goodsName

2.对于type为long,数组形式存储的但属性值的查询。如上述示例中的buIds,主要为java对象中List buIds 的用法

3.object类型和nested类型的查询(上述示例中的manager和managers)

五、更新索引

1.通过put插入索引的方式,指定id后,把要改的字段,全都写一遍,重新进行索引,如果是新增的字段,如果索引模式设置了自动适配就会新增该字段(默认是新增)。相同的字段进行更新,缺少的字段更新为空

2.通过update by query语句进行更新,示例如下

六.删除语句 delete by query 语句进行,务必要加条件,不然会删除所有数据,慎用

七、分页

八、聚合



一、添加索引

  1. 语法:PUT 你的索引名称

  2. 示例:PUT goods_for_test_use

二、设置mapping

属性映射类型可参考:

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html

示例

PUT goods_for_test_use/goods_for_test/_mapping
{"properties": {"goodsId":{"type": "keyword"},"goodsName":{"type": "keyword"},"buIds":{"type": "long"},"gmv":{"type": "double"},"manager":{"type": "object","properties": {"firstName":{"type":"keyword"},"secondName":{"type":"keyword"},"age":{"type":"long"}}},"managers":{"type": "nested","properties": {"firstName":{"type":"keyword"},"secondName":{"type":"keyword"},"age":{"type":"long"}}}}
}

三、插入数据

插入数据,只要根据mapping设置的数据类型,组装相应的json串即可,见示例代码

##插入数据第一条数据,这里的1表示的是索引中文档的id,可根据业务语义设置即可,如使用商品id
PUT goods_for_test_use/_doc/1
{"goodsId":"222","goodsName":"测试商品名称2","buIds":[1,2,3],"gmv":333,"manager":[{"firstName":"lei","secondName":"teng"},{"fistName":"zhang","secondName":"san"}],"managers":[{"firstName":"lei","secondName":"teng","age":30},{"firstName":"zhang","secondName":"san","age":18},{"firstName":"lei","secondName":"san","age":18}]
}

四、查询数据

以上mapping的设置,涵盖了四种常用的数据类型。对每种数据类型查询做下分析

1.简单数据类型:如上述示例中的goodsId,goodsName

## 查询goodsId 为goodsId222 且商品名称为测试商品名称2的数据
GET goods_for_test_use/_search
{"query": {"bool": {"must": [{"match": {"goodsId": "goodsId222"}},{"match": {"goodsName": "测试商品名称2"}}]}}
}

2.对于type为long,数组形式存储的但属性值的查询。如上述示例中的buIds,主要为java对象中List<Long> buIds 的用法

## 注意,单属性数组形式存储的数据,使用terms查询,代表in的意思,不能使用term(等值查询)
GET goods_for_test_use/_search
{"query": {"bool": {"must": [{"terms": {"buIds": ["1","5"]}}]}}
}

3.object类型和nested类型的查询(上述示例中的manager和managers)

在示例中:manager 属性type类型为object,插入的两个对象为管理者一:
firstName:lei
secondName:teng
管理者二:
firstName:zhang
secondName:san
managers 属性类型为nested,插入的三个管理这对象为管理者一:
firstName:lei
secondName:teng
管理者二:
firstName:zhang
secondName:san
管理者三:
firstName:lei
secondName:san

现在如果我们要查询管理者firstName="lei"并且secondName="san"的商品记录,如果manager属性为object类型,则查询时,即使没有名字叫lei、san的管理者,但是也会把记录匹配出来。

## object 类型的对象查询
GET goods_for_test_use/_search
{"query": {"bool": {"must": [{"match": {"manager.firstName": "lei"}},{"match": {"manager.secondName": "san"}}]}}
}
## 查询到的结果
{"took" : 1,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : 1,"max_score" : 1.3862944,"hits" : [{"_index" : "goods_for_test_use","_type" : "goods_for_test","_id" : "2","_score" : 1.3862944,"_source" : {"goodsId" : "goodsId222","goodsName" : "测试商品名称2","buIds" : [1,2,3],"manager" : [{"firstName" : "lei","secondName" : "teng"},{"fistName" : "zhang","secondName" : "san"}],"managers" : [{"firstName" : "lei","secondName" : "teng","age" : 30},{"fistName" : "zhang","secondName" : "san","age" : 18},{"fistName" : "lei","secondName" : "san","age" : 18}]}}]}
}

发生这种情况的原因是因为,type为object类型在elastic内部存储类似如下:

{"goodsId" :        "goodsId222","goodsName" :       "测试商品名称2","manager.firstName" :  [ "lei", "zhang" ]"manager.secondName":  ["teng","san]
}
  • manager 为object 类型,内部存储结构被扁平化为多值字段,类似示例中的buIds,因此可以查询到lei、san的管理者数据,这是不满足查询语义的。
  • 因此如果为了保障各对象的相对独立性,需要采用managers的方式,定义类型为nested,其内部是作为独立对象存储的,可以用于查询等操作,具体查询语句如下
GET goods_for_test_use/_search
{"query": {"nested": {"path": "managers","query": {"bool": {"must": [{"match": {"managers.firstName": "lei"}},{"match": {"managers.secondName": "san"}}]}}}}
}

执行以上嵌套查询,就可以查到真实的姓名leisan的数据了,因为确实存储了。

五、更新索引

1.通过put插入索引的方式,指定id后,把要改的字段,全都写一遍,重新进行索引,如果是新增的字段,如果索引模式设置了自动适配就会新增该字段(默认是新增)。相同的字段进行更新,缺少的字段更新为空

PUT goods_for_test_use/_doc/1
{"goodsId":"111","goodsName":"测试商品名称1","buIds":[1,2,3],"manager":[{"firstName":"heh","secondName":"teng"},{"fistName":"zhang","secondName":"san"}],"managers":[{"firstName":"lei","secondName":"teng","age":30},{"firstName":"zhang","secondName":"san","age":18},{"firstName":"lei","secondName":"san","age":18}]
}

2.通过update by query语句进行更新,示例如下

POST goods_for_test_use/_update_by_query
{"script":{"source":"ctx._source['goodsName']='雷腾测试商品';ctx._source['buIds']=[1,2,4]"},"query":{"bool":{"must":[{"match":{"goodsId":"111"}}]}}
}

六.删除语句 delete by query 语句进行,务必要加条件,不然会删除所有数据,慎用

POST goods_for_test_use/_delete_by_query
{"query":{"bool":{"must":[{"match":{"goodsId":"111"}}]}}
}

七、分页

GET goods_for_test_use/_search
{"from": 0,"size": 20
}

八、聚合

1.agg terms分桶,类似于sql中的group by; agg 各种指标函数,类似于sql中的sum、avg、max、min等。并且可以联合使用

示例如下

## 查询语句,统计每个商品的gmv综合
GET goods_for_test_use/_search
{"aggs": {"商品id": {"terms": {"field": "goodsId","size": 10}, "aggs": {"总的gmv": {"sum": {"field": "gmv"}}}}},"size": 0
}
## 查询的结果
{"took" : 7,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : 6,"max_score" : 0.0,"hits" : [ ]},"aggregations" : {"商品id" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "111","doc_count" : 3,"总的gmv" : {"value" : 765.0}},{"key" : "222","doc_count" : 3,"总的gmv" : {"value" : 999.0}}]}}
}

ElasticSearch常用语法大全相关推荐

  1. shell脚本常用语法大全

    shell脚本常用语法大全 一.shell简介 二.shell常用命令 2.1echo 2.2printf 2.3test 三.shell变量 3.1变量命名规则 3.2赋值方式 3.3使用变量 3. ...

  2. Markdown常用语法大全

    Markdown学习 目录 目录创建方式:[TOC]是Table Of Contents的缩写 文章目录 Markdown学习 目录 标题 字体 引用 分割线 插入图片 超链接 列表 有序列表 无序列 ...

  3. sqlserver常用语法大全

    查看锁表 SELECT request_session_id spid,OBJECT_NAME(resource_associated_entity_id)tableName FROM sys.dm_ ...

  4. 【自用】【持续更新】LaTeX常用基础语法大全

    目录 LaTeX常用基础语法大全 段落 居中 排序列表 文本.变量 加粗 斜体 向量(顶有向量箭头→) 估计(顶有尖头hat) 平均(顶有横线) 顶有波浪号~ 24个希腊字母 花体.集合手写体 大型运 ...

  5. python常用代码大全-Python常用库大全

    Python常用库大全,看看有没有你需要的. 环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具 ...

  6. python代码库-Python常用库大全

    Python常用库大全,看看有没有你需要的. 环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具 ...

  7. Ubuntu常用命令大全[显示桌面]

    Ubuntu常用命令大全 查看软件xxx安装内容 #dpkg -L xxx 查找软件 #apt-cache search 正则表达式 查找文件属于哪个包 #dpkg -S filename apt-f ...

  8. javascript常用代码大全

    http://caibaojian.com/288.html     原文链接 jquery选中radio//如果之前有选中的,则把选中radio取消掉 $("#tj_cat .pro_ca ...

  9. Hive常用函数大全一览

    Hive常用函数大全一览 1 关系运算 1.1 1.等值比较: = 1.2 2.不等值比较: 1.3 3.小于比较: < 1.4 4.小于等于比较: <= 1.5 5.大于比较: > ...

  10. 嵌入式linux基本指令,成都嵌入式开发之Linux常用命令大全

    原标题:成都嵌入式开发之Linux常用命令大全 Linux系统中有很多命令,使用Linux系统最常用的就是命令操作,而不是像Windows一样,使用鼠标操作.Linux中许多常用命令是必须掌握的,也有 ...

最新文章

  1. Windows环境下的NodeJS+NPM+Bower安装配置
  2. 王者荣耀全栈项目部署到阿里云服务器笔记
  3. phpshe b2c商城系统配置nginx支持pathinfo和rewrite的写法
  4. Python合并字典的七种方式!
  5. php isapi mysql_windows server 2003以isapi的方式配置php+mysql环境的详细过程
  6. ----------------学习进度表---------------------------------
  7. 自定义View,圆形头像
  8. easy-ui的datagrid
  9. tcp有限状态机分析
  10. html怎么把新闻列表放在右边,div+css实现简洁、清晰的新闻列表样式(浮动使日期靠右)...
  11. 无人车系统(三):用python写一个简单的无人车仿真环境
  12. 怎么查询网络热点事件的舆论热度的办法技巧
  13. C语言正则表达式详解 regcomp() regexec() regfree()详解
  14. photoshop制作烫金效果logo详细教程
  15. ev4a ev6 ev8文件转换为mp4翻录教程
  16. Centos操作系统yum源的使用
  17. 嵌入式系统设计 (考试题+答案)
  18. SQL(MySQL)
  19. OpenTX与EdgeTX---kalrry
  20. Uber——面向领域的微服务架构

热门文章

  1. vue从零搭建一个前中后台权限管理模板
  2. (论文笔记)NeRV: Neural Representations for Videos
  3. IT项目启示录——来自泰坦尼克号的教训(第五篇)(转)
  4. 3GPP最新提案查询方法
  5. windows资源管理器转圈崩溃
  6. k8s重要概念及部署k8s集群(一)
  7. nuc8 黑苹果_NUC Hades Canyon (NUC8) 黑苹果(Hackintosh)安装指南
  8. 计算机网申兴趣爱好怎么写,网申简历中的特长爱好到底怎么写
  9. 使用jib-maven-plugin分层构建Docker镜像——避免直接使用FatJar
  10. Beamer 使用笔记