Kibana的HTTP操作类似,可以看四、Kibana安装部署及使用 5. 查询语句

1. 查看ES各种信息

1.1 检查ES是否可用

  1. GET IP:9200

image.png

1.2 查看有多少节点

  1. GET IP:9200/_cat/nodes

image.png

1.3 查看集群健康状态

  1. GET IP:9200/_cluster/health?pretty
**status**
字段只是这当前集群在总体上是否工作正常,他的三种颜色含义如下:
green
所有的主分片和副本分片都正常运行
yellow
所有的主分片都运行正常,但不是所有的副本分片都正常运行
red
有主分片没能正常运行

image.png

1.4 查看所有索引及索引状态

  1. GET IP:9200/_cat/indices?v

image.png

1.5 使用分词器分析词条

  1. GET /_analyze
  2. {
  3. "analyzer": "standard",
  4. "text": "hello world"
  5. }
  6. # "analyzer": "standard":
  7. # 是指定使用哪个分词器,standard是自带分词器
  8. # 如果装了ik分词器
  9. # 1. 可以使用ik_max_word --- 会将文本做最细粒度的拆分
  10. # 2. 还可以使用ik_smart --- 会将文本做最粗粒度的拆分
  11. # "text": "hello world"是指定文本

2. 索引

对比关系型数据库,索引就等同于数据库

2.1 创建

  1. PUT http://hadoop101:9200/shopping
  2. # 无body

2.2 创建索引同时创建映射、设置分片和副本

  1. PUT http://hadoop101:9200/student1
  2. # body如下:
  3. {
  4. "settings" : {
  5. "number_of_shards" : 3, // 3个主分片
  6. "number_of_replicas" : 1 // 每个分片1个副本
  7. },
  8. "mapping":{
  9. "properties":{
  10. "name":{
  11. "type":"text", // 文本类型,会分词
  12. "index":true // 索引,该字段可以搜索,默认true
  13. },
  14. "sex":{
  15. "type":"keyword", // 关键字类型,不分词,必须整条记录搜索才能搜到
  16. "index":true // 索引,该字段可以搜索,默认true
  17. },
  18. "tel":{
  19. "type":"text", // 文本类型,会分词
  20. "store":true // 是否单独存储,默认数据会存储到_source中,如果配置store为true,会将该字段单独存储,查询会非常快,但会占用更多的空间
  21. }
  22. }
  23. }
  24. }

2.3 修改副本分片数

  1. PUT http://hadoop101:9200/person1/_settings
  2. {
  3. "number_of_replicas" : 2
  4. }

2.4 查询所有

  1. GET http://hadoop101:9200/_cat/indices?v
  2. # 结果如下:
  3. health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
  4. green open student1 fgI0uB9zTZGXVo3geDtn9w 1 1 0 0 416b 208b
  5. green open user gQAHQT92Q7mbLC394fHtDw 1 1 1 0 7.6kb 3.8kb
  6. green open shopping LsvqKvmSTo6yhllrQL-oEw 1 1 3 0 22.8kb 11.4kb

image.png

2.5 查询单个

  1. GET http://hadoop101:9200/shopping

2.6 删除

  1. DELETE http://hadoop101:9200/shopping

2.7 刷新索引

慎用 ES默认1s刷新一次 在索引构建时,可以先关闭自动刷新,让索引构建更快,待开始使用索引时再打开 如果不需要近实时搜索,可以调大刷新间隔,提高索引效率

  1. PUT /users/_settings # 关闭自动刷新
  2. {
  3. "refresh_interval": -1
  4. }
  5. PUT /users/_settings # 每一秒刷新
  6. {
  7. "refresh_interval": "1s"
  8. }
  9. PUT /users/_refresh # 手动刷新

3. 映射

对比关系型数据库,映射就等同于表结构

映射数据说明:

映射 类型 描述
type text(String类型) 可分词
keyword(String类型) 不可分词,数据会作为完整字段进行匹配
long、integer、short、byte、double、float、half_float 基本数据类型
scaled_float 浮点数的高精度类型
Date 日期类型
Array 数组类型
Object 对象
index true/false true:默认,字段会被索引,则可以用来进行搜索
false:字段不会被索引,不能用来搜索
store true/false 原始的文本会存储在_source 里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source 里面提取出来的。当然你也可以独立的存储某个字段,只要设置”store”: true 即可,获取独立存储的字段要比从_source 中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置。
analyzer ik 分词器

3.1 创建

  1. PUT http://hadoop101:9200/shopping/_mapping
  2. # body如下:
  3. {
  4. "properties":{
  5. "name":{ // 字段名,任意填写
  6. "type":"text", // 文本类型,会分词
  7. "index":true // 索引,该字段可以搜索,默认true
  8. },
  9. "sex":{
  10. "type":"keyword", // 关键字类型,不分词,必须整条记录搜索才能搜到
  11. "index":true // 索引,该字段可以搜索,默认true
  12. },
  13. "tel":{
  14. "type":"text", // 文本类型,会分词
  15. "store":true // 是否单独存储,默认数据会存储到_source中,如果配置store为true,会将该字段单独存储,查询会非常快,但会占用更多的空间
  16. }
  17. }
  18. }

3.2 创建索引同时创建映射

参考:1.2 创建索引同时创建映射、设置分片和副本

3.3 查看映射

  1. GET http://hadoop101:9200/user/_mapping

4. 文档

对比关系型数据库,文档就等同于数据

4.1 新增

4.1.1 随机_id

  1. POST http://hadoop101:9200/shopping/_doc
  2. # body如下:
  3. {
  4. "title":"小米手机",
  5. "category":"小米",
  6. "images":"http://www.gulixueyuan.com/xm.jpg",
  7. "price":3999.00
  8. }

4.1.2 自定义_id

  1. POST http://hadoop101:9200/shopping/_doc/1001
  2. # body如下:
  3. {
  4. "title":"小米手机",
  5. "category":"小米",
  6. "images":"http://www.gulixueyuan.com/xm.jpg",
  7. "price":3999.00
  8. }

4.2 查询

4.2.1 主键查询

  1. GET http://hadoop101:9200/shopping/_doc/1001

4.2.2 全部查询

  1. GET http://hadoop101:9200/shopping/_doc/_search

4.2.3 高级查询

参考:4. 高级查询

4.3 修改

4.3.1 某条记录某个字段

  1. POST http://hadoop101:9200/shopping/_update/1001
  2. {
  3. "doc":{
  4. "title":"华为手机"
  5. }
  6. }

4.3.2 某条记录全字段

  1. POST http://hadoop101:9200/shopping/_doc/1001
  2. # body如下:
  3. {
  4. "title":"小米手机",
  5. "category":"小米",
  6. "images":"http://www.gulixueyuan.com/xm.jpg",
  7. "price":4999.00
  8. }

4.4 删除

4.4.1 主键删除

  1. DELETE http://hadoop101:9200/shopping/_doc/1002

4.4.2 条件删除

  1. POST http://hadoop101:9200/shopping/_delete_by_query
  2. # body如下;
  3. {
  4. "query":{
  5. "match":{
  6. "price":3999.00
  7. }
  8. }
  9. }

5. 高级查询

5.1 查询所有—-match_all

  1. GET http://hadoop101:9200/shopping/_search
  2. # body如下:
  3. {
  4. "query": {
  5. "match_all": {}
  6. }
  7. }

5.2 分词词条匹配查询

5.2.1 单字段分词词条匹配查询—-match

将查询条件先分词,根据分词后的每一个词条去匹配,词条之间是or的关系,结果取并集

match查询keyword字段,match会被分词,而keyword不会被分词,match的条件需要跟keyword的完全匹配才可以。 match查询text字段,match分词,text也分词只要match的分词结果和text的分词结果有相同的就匹配

  1. GET http://hadoop101:9200/shopping/_search
  2. # body如下:
  3. {
  4. "query":{
  5. "match":{
  6. "title":"华为手机"
  7. }
  8. }
  9. }

5.2.2 多字段分词词条匹配查询—-multi_match

将查询条件先分词,根据分词后的每一个词条在多个字段中去匹配(text类似于多词条like,keyword需要词条完全匹配),词条之间是or的关系,结果取并集

  1. GET http://hadoop101:9200/shopping/_search
  2. # body如下:
  3. {
  4. "query":{
  5. "multi_match":{
  6. "query":"华为",
  7. "fields":["catgory","title"]
  8. }
  9. }
  10. }

5.3 短语匹配查询—-match_phrase

match_phrase匹配keyword字段。match_phrase会被分词,而keyword不会被分词,match_phrase需要跟keyword的完全匹配才可以。 match_phrase匹配text字段。match_phrase是分词的,text也是分词的match_phrase的分词结果必须在text字段分词中都包含,而且顺序必须相同,而且必须都是连续的。类似于like

  1. GET http://hadoop101:9200/shopping/_search
  2. # body如下:
  3. {
  4. "query":{
  5. "match_phrase":{
  6. "title":"华为手机"
  7. }
  8. }
  9. }

5.4 关键字精确查询

5.4.1 单关键词精确查询—-term

term查询keyword字段,term不会分词。而keyword字段也不分词需要完全匹配才可以。 term查询text字段,因为text字段会分词,而term不分词,所以term查询的条件必须是text字段分词后的某一个词条

  1. GET http://hadoop101:9200/shopping/_search
  2. # body如下:
  3. {
  4. "query":{
  5. "term":{
  6. "title":{
  7. "value":"华"
  8. }
  9. }
  10. }
  11. }

5.4.2 多关键字精确查询—-terms

  1. GET http://hadoop101:9200/shopping/_search
  2. # body如下:
  3. {
  4. "query":{
  5. "terms":{
  6. "title":["华","为"]
  7. }
  8. }
  9. }

5.5 (不)返回指定字段查询—-includes、excludes

  1. GET http://hadoop101:9200/shopping/_search
  2. # includes的body如下:
  3. {
  4. "_source":{
  5. "includes":["title"]
  6. }
  7. }
  8. # excludes的body如下:
  9. {
  10. "_source":{
  11. "excludes":["title"]
  12. }
  13. }

5.6 组合查询—-bool

bool 把各种其它查询通过 **must** (必须 )、 **must_not** (必须不)、 **should** (应该)的方式进行组合

  1. GET http://hadoop101:9200/shopping/_search
  2. # body如下:
  3. {
  4. "query":{
  5. "bool":{
  6. "must":[
  7. {
  8. "match":{
  9. "title":"手机"
  10. }
  11. },
  12. {
  13. "match":{
  14. "price":3999
  15. }
  16. }
  17. ]
  18. }
  19. }
  20. }

5.7 范围查询—-range

  1. GET http://hadoop101:9200/shopping/_search
  2. # body如下:
  3. {
  4. "query":{
  5. "bool":{
  6. "must":[
  7. {
  8. "match":{
  9. "title":"手机"
  10. }
  11. }
  12. ],
  13. "filter":{
  14. "range":{
  15. "price":{
  16. "gt":4000
  17. }
  18. }
  19. }
  20. }
  21. }
  22. }

5.8 通配符查询—-wildcard

wildcard查询text字段,wildcard不分词,text分词,需要通配符匹配text分词后的词条 wildcard查询keyword字段,wildcard不分词,keyword不分词,通配符匹配完全like模式

  1. GET http://hadoop101:9200/user/_search
  2. # body如下:
  3. {
  4. "query":{
  5. "wildcard":{
  6. "sex":"*的"
  7. }
  8. }
  9. }

5.9 纠错查询—-fuzzy

例:输入个“吴疫烦”,也能把“吴亦凡”查出来,有一定的纠错能力 通过 fuzziness 修改编辑距离。一般使用默认值 AUTO,根据术语的长度生成编辑距离。实际就是能容忍 错/少 几个字符,比如“吴疫烦”和“吴亦凡”fuzziness就是2

image.png
image.png
image.png
image.png

5.10 排序查询—-sort、order

text字段不支持聚合和排序

5.10.1 单字段排序查询

  1. GET http://hadoop101:9200/shopping/_search
  2. # body如下:
  3. {
  4. "query":{
  5. "match_all":{
  6. }
  7. },
  8. "sort":{
  9. "price":{
  10. "order":"desc"
  11. }
  12. }
  13. }

5.10.2 多字段排序查询

  1. GET http://hadoop101:9200/shopping/_search
  2. # body如下:
  3. {
  4. "query":{
  5. "match_all":{
  6. }
  7. },
  8. "sort":[
  9. {
  10. "price":{
  11. "order":"desc"
  12. }
  13. },
  14. {
  15. "_score":{
  16. "order":"desc"
  17. }
  18. }
  19. ]
  20. }

5.11 高亮查询—-highlight

  1. GET http://hadoop101:9200/shopping/_search
  2. # body如下:
  3. {
  4. "query":{
  5. "match":{
  6. "title":"华为"
  7. }
  8. },
  9. "highlight": {
  10. "pre_tags": "<font color='red'>", // 前缀
  11. "post_tags": "</font>", // 后缀
  12. "fields": {
  13. "title": {} //高亮字段
  14. }
  15. }
  16. }

5.12 分页查询—-from、size

  1. GET http://hadoop101:9200/shopping/_search
  2. # body如下:
  3. {
  4. "query":{
  5. "match_all":{
  6. }
  7. },
  8. "from":0, // 从第几条开始,from=(页数-1)*size
  9. "size":1 // 每页多少量
  10. }

5.13 聚合查询—-aggs

text字段不支持聚合和排序

  1. GET http://hadoop101:9200/shopping/_search
  2. // 分组(桶聚合查询)
  3. {
  4. "aggs":{ // 分组查询
  5. "price_group":{ // 名称,随意起名
  6. "terms":{ // 分组
  7. "field":"price" // 分组字段
  8. }
  9. }
  10. },
  11. "size": 0 // 如果不想查询结果中带有原始数据,可以设置size为0
  12. }
  13. // 平均值
  14. {
  15. "aggs":{ // 分组查询
  16. "price_avg":{ // 名称,随意起名
  17. "avg":{ // 平均值
  18. "field":"price" // 分组字段
  19. }
  20. }
  21. },
  22. "size":0 // 如果不想查询结果中带有原始数据,可以设置size为0
  23. }
  24. // 最大值
  25. {
  26. "aggs":{ // 分组查询
  27. "price_max":{ // 名称,随意起名
  28. "max":{ // 最大值
  29. "field":"price" // 分组字段
  30. }
  31. }
  32. },
  33. "size":0 // 如果不想查询结果中带有原始数据,可以设置size为0
  34. }
  35. // 最小值
  36. {
  37. "aggs":{ // 分组查询
  38. "price_min":{ // 名称,随意起名
  39. "min":{ // 最小值
  40. "field":"price" // 分组字段
  41. }
  42. }
  43. },
  44. "size":0 // 如果不想查询结果中带有原始数据,可以设置size为0
  45. }
  46. // 去重后取总数
  47. {
  48. "aggs":{ // 分组查询
  49. "distinct_price":{ // 名称,随意起名
  50. "cardinality":{ // 去重取总数
  51. "field":"price" // 去重字段
  52. }
  53. }
  54. },
  55. "size":0
  56. }
  57. // state聚合,对某个字段一次性返回 count,max,min,avg 和 sum 五个指标
  58. {
  59. "aggs":{ // 分组查询
  60. "stats_age":{ // 名称,随意起名
  61. "stats":{ // state聚合
  62. "field":"age" // 聚合字段
  63. }
  64. }
  65. },
  66. "size":0
  67. }

5.14 桶聚合查询—-aggs、terms

桶聚和相当于 sql 中的 group by 语句 text字段不支持聚合和排序

  1. GET http://hadoop101:9200/shopping/_search
  2. # terms聚合,分组统计,body如下:
  3. {
  4. "aggs":{
  5. "price_groupby":{
  6. "terms":{"field":"price"}
  7. }
  8. },
  9. "size":0
  10. }
  11. # 在terms分组下再进行聚合,body如下:
  12. {
  13. "aggs":{
  14. "price_groupby":{
  15. "terms":{"field":"price"},
  16. "aggs":{
  17. "sum_price":{
  18. "sum":{
  19. "field":"price"
  20. }
  21. }
  22. }
  23. }
  24. },
  25. "size":0
  26. }