Elasticsearch入门(三)高级查询操作

news2024/11/19 6:34:31

前期准备

先把上一个内容的 student 索引删除掉

在 Postman 中,向 ES 服务器发 DELETE 请求:http://127.0.0.1:9200/student

在 Postman 中,向 ES 服务器发五个 POST 请求:http://127.0.0.1:9200/student/_doc/100x

x分别是1,2,3,4,5,6,每次请求携带自己的请求体,请求体内容在下方代码块里

 
  1. {

  2. "name":"zhangsan",

  3. "nickname":"zhangsan",

  4. "sex":"男",

  5. "age":30

  6. }

  7. {

  8. "name":"lisi",

  9. "nickname":"lisi",

  10. "sex":"男",

  11. "age":20

  12. }

  13. {

  14. "name":"wangwu",

  15. "nickname":"wangwu",

  16. "sex":"女",

  17. "age":40

  18. }

  19. {

  20. "name":"zhangsan1",

  21. "nickname":"zhangsan1",

  22. "sex":"女",

  23. "age":50

  24. }

  25. {

  26. "name":"zhangsan2",

  27. "nickname":"zhangsan2",

  28. "sex":"女",

  29. "age":30

  30. }

  31. {

  32. "name":"zhangsan222",

  33. "nickname":"zhangsan222",

  34. "sex":"女",

  35. "age":30

  36. }

高级查询

本内容基本都是对请求体进行配置,也是 ElasticSearch 的语法核心所在。查询都是用 GET 请求。

1. 查询所有文档

http://127.0.0.1:9200/student/_search

请求体内容:

 
  1. {

  2. "query": {

  3. "match_all": {}

  4. }

  5. }

  6. # "query":这里的 query 代表一个查询对象,里面可以有不同的查询属性

  7. # "match_all":查询类型,例如:match_all(代表查询所有),match,term,range 等等

  8. # {查询条件}:查询条件会根据类型的不同,写法也有差异

 结果:

 
  1. {

  2. "took": 1,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 6,

  13. "relation": "eq"

  14. },

  15. "max_score": 1.0,

  16. "hits": [

  17. {

  18. "_index": "student",

  19. "_type": "_doc",

  20. "_id": "1001",

  21. "_score": 1.0,

  22. "_source": {

  23. "name": "zhangsan",

  24. "nickname": "zhangsan",

  25. "sex": "男",

  26. "age": 30

  27. }

  28. },

  29. {

  30. "_index": "student",

  31. "_type": "_doc",

  32. "_id": "1002",

  33. "_score": 1.0,

  34. "_source": {

  35. "name": "lisi",

  36. "nickname": "lisi",

  37. "sex": "男",

  38. "age": 20

  39. }

  40. },

  41. {

  42. "_index": "student",

  43. "_type": "_doc",

  44. "_id": "1003",

  45. "_score": 1.0,

  46. "_source": {

  47. "name": "wangwu",

  48. "nickname": "wangwu",

  49. "sex": "女",

  50. "age": 40

  51. }

  52. },

  53. {

  54. "_index": "student",

  55. "_type": "_doc",

  56. "_id": "1004",

  57. "_score": 1.0,

  58. "_source": {

  59. "name": "zhangsan1",

  60. "nickname": "zhangsan1",

  61. "sex": "女",

  62. "age": 50

  63. }

  64. },

  65. {

  66. "_index": "student",

  67. "_type": "_doc",

  68. "_id": "1005",

  69. "_score": 1.0,

  70. "_source": {

  71. "name": "zhangsan2",

  72. "nickname": "zhangsan2",

  73. "sex": "女",

  74. "age": 30

  75. }

  76. },

  77. {

  78. "_index": "student",

  79. "_type": "_doc",

  80. "_id": "1006",

  81. "_score": 1.0,

  82. "_source": {

  83. "name": "zhangsan222",

  84. "nickname": "zhangsan222",

  85. "sex": "女",

  86. "age": 30

  87. }

  88. }

  89. ]

  90. }

  91. }

2. 分词查询

http://127.0.0.1:9200/student/_search

请求体:

 
  1. {

  2. "query": {

  3. "match": {

  4. "name": "zhangsan2"

  5. }

  6. }

  7. }

查询 name为 zhangsan2 的数据 

查询结果:

 
  1. {

  2. "took": 287,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 1,

  13. "relation": "eq"

  14. },

  15. "max_score": 1.540445,

  16. "hits": [

  17. {

  18. "_index": "student",

  19. "_type": "_doc",

  20. "_id": "1005",

  21. "_score": 1.540445,

  22. "_source": {

  23. "name": "zhangsan2",

  24. "nickname": "zhangsan2",

  25. "sex": "女",

  26. "age": 30

  27. }

  28. }

  29. ]

  30. }

  31. }

3. 字段匹配查询

匹配查询用到 multi_match

multi_match 与 match 类似,不同的是它可以在多个字段中查询。

http://127.0.0.1:9200/student/_search

请求体内容:

 
  1. {

  2. "query": {

  3. "multi_match": {

  4. "query": "zhangsan",

  5. "fields": ["name","nickname"]

  6. }

  7. }

  8. }

查询 key 为 name 和 nickname,value 为 zhangsan 的数据

 结果

 
  1. {

  2. "took": 52,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 1,

  13. "relation": "eq"

  14. },

  15. "max_score": 1.540445,

  16. "hits": [

  17. {

  18. "_index": "student",

  19. "_type": "_doc",

  20. "_id": "1001",

  21. "_score": 1.540445,

  22. "_source": {

  23. "name": "zhangsan",

  24. "nickname": "zhangsan",

  25. "sex": "男",

  26. "age": 30

  27. }

  28. }

  29. ]

  30. }

  31. }

4. 单关键字精确查询

term 查询,精确的关键词匹配查询,不对查询条件进行分词,即只能单关键字精确查询。

http://127.0.0.1:9200/student/_search

请求体内容:

 
  1. {

  2. "query": {

  3. "term": {

  4. "name": {

  5. "value": "zhangsan"

  6. }

  7. }

  8. }

  9. }

 查询 key 为 name,value 为 zhangsan 的数据

结果 

 
  1. {

  2. "took": 4,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 1,

  13. "relation": "eq"

  14. },

  15. "max_score": 1.540445,

  16. "hits": [

  17. {

  18. "_index": "student",

  19. "_type": "_doc",

  20. "_id": "1001",

  21. "_score": 1.540445,

  22. "_source": {

  23. "name": "zhangsan",

  24. "nickname": "zhangsan",

  25. "sex": "男",

  26. "age": 30

  27. }

  28. }

  29. ]

  30. }

  31. }

 5. 多关键字精确查询

terms 查询和 term 查询一样,但它允许你指定多值进行匹配。

如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件,类似于 mysql 的 in 在

http://127.0.0.1:9200/student/_search

 
  1. {

  2. "query": {

  3. "terms": {

  4. "name": ["zhangsan","lisi"]

  5. }

  6. }

  7. }

 查询 key 为 name,value 分别为 zhangsan 和 lisi 的数据

结果:

 
  1. {

  2. "took": 14,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 2,

  13. "relation": "eq"

  14. },

  15. "max_score": 1.0,

  16. "hits": [

  17. {

  18. "_index": "student",

  19. "_type": "_doc",

  20. "_id": "1001",

  21. "_score": 1.0,

  22. "_source": {

  23. "name": "zhangsan",

  24. "nickname": "zhangsan",

  25. "sex": "男",

  26. "age": 30

  27. }

  28. },

  29. {

  30. "_index": "student",

  31. "_type": "_doc",

  32. "_id": "1002",

  33. "_score": 1.0,

  34. "_source": {

  35. "name": "lisi",

  36. "nickname": "lisi",

  37. "sex": "男",

  38. "age": 20

  39. }

  40. }

  41. ]

  42. }

  43. }

6. 指定字段查询(指定返回结果)

默认情况下,Elasticsearch 在搜索的结果中,会把文档中保存在 _source 的所有字段都返回。

如果我们只想获取其中的部分字段,我们可以添加 _source 的过滤

 http://127.0.0.1:9200/student/_search

请求体内容:

 
  1. {

  2. "_source": ["name","nickname"],

  3. "query": {

  4. "terms": {

  5. "nickname": ["zhangsan"]

  6. }

  7. }

  8. }

只需要查询出 key 为 name 和 nickname,value 为 zhangsan 的数据

 结果:

 
  1. {

  2. "took": 3,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 1,

  13. "relation": "eq"

  14. },

  15. "max_score": 1.0,

  16. "hits": [

  17. {

  18. "_index": "student",

  19. "_type": "_doc",

  20. "_id": "1001",

  21. "_score": 1.0,

  22. "_source": {

  23. "name": "zhangsan",

  24. "nickname": "zhangsan"

  25. }

  26. }

  27. ]

  28. }

  29. }

 7.  过滤字段

用到的字段:

  • includes:来指定想要显示的字段
  • excludes:来指定不想要显示的字段

includes 使用

http://127.0.0.1:9200/student/_search

请求体内容:

 
  1. {

  2. "_source": {

  3. "includes": ["name","nickname"]

  4. },

  5. "query": {

  6. "terms": {

  7. "nickname": ["zhangsan"]

  8. }

  9. }

  10. }

结果:

 
  1. {

  2. "took": 2,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 1,

  13. "relation": "eq"

  14. },

  15. "max_score": 1.0,

  16. "hits": [

  17. {

  18. "_index": "student",

  19. "_type": "_doc",

  20. "_id": "1001",

  21. "_score": 1.0,

  22. "_source": {

  23. "name": "zhangsan",

  24. "nickname": "zhangsan"

  25. }

  26. }

  27. ]

  28. }

  29. }

8. 组合查询

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

http://127.0.0.1:9200/student/_search

请求体内容:

 
  1. {

  2. "query": {

  3. "bool": {

  4. "must": [

  5. {

  6. "match": {

  7. "name": "zhangsan"

  8. }

  9. }

  10. ],

  11. "must_not": [

  12. {

  13. "match": {

  14. "age": "40"

  15. }

  16. }

  17. ],

  18. "should": [

  19. {

  20. "match": {

  21. "sex": "男"

  22. }

  23. }

  24. ]

  25. }

  26. }

  27. }

查询 name 必须为 zhangsan,age 不能是 40,sex 可以是男的数据

 结果:

 
  1. {

  2. "took": 10,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 1,

  13. "relation": "eq"

  14. },

  15. "max_score": 2.5700645,

  16. "hits": [

  17. {

  18. "_index": "student",

  19. "_type": "_doc",

  20. "_id": "1001",

  21. "_score": 2.5700645,

  22. "_source": {

  23. "name": "zhangsan",

  24. "nickname": "zhangsan",

  25. "sex": "男",

  26. "age": 30

  27. }

  28. }

  29. ]

  30. }

  31. }

9. 范围查询

range 查询找出那些落在指定区间内的数字或者时间。range 查询允许以下字符

操作符说明
gt大于 >
gte大于等于 >=
lt小于 <
lte小于等于 <=

http://127.0.0.1:9200/student/_search

请求体内容:

 
  1. {

  2. "query": {

  3. "range": {

  4. "age": {

  5. "gte": 30,

  6. "lte": 35

  7. }

  8. }

  9. }

  10. }

查询年龄大于等于 30 小于等于 35 的数据 

 结果

 
  1. {

  2. "took": 4,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 3,

  13. "relation": "eq"

  14. },

  15. "max_score": 1.0,

  16. "hits": [

  17. {

  18. "_index": "student",

  19. "_type": "_doc",

  20. "_id": "1001",

  21. "_score": 1.0,

  22. "_source": {

  23. "name": "zhangsan",

  24. "nickname": "zhangsan",

  25. "sex": "男",

  26. "age": 30

  27. }

  28. },

  29. {

  30. "_index": "student",

  31. "_type": "_doc",

  32. "_id": "1005",

  33. "_score": 1.0,

  34. "_source": {

  35. "name": "zhangsan2",

  36. "nickname": "zhangsan2",

  37. "sex": "女",

  38. "age": 30

  39. }

  40. },

  41. {

  42. "_index": "student",

  43. "_type": "_doc",

  44. "_id": "1006",

  45. "_score": 1.0,

  46. "_source": {

  47. "name": "zhangsan222",

  48. "nickname": "zhangsan222",

  49. "sex": "女",

  50. "age": 30

  51. }

  52. }

  53. ]

  54. }

  55. }

10.模糊查询

返回包含与搜索字词相似的字词的文档。使用的字段是 fuzzy

编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数。这些更改可以包括:

  • 更改字符(box → fox)

  • 删除字符(black → lack)

  • 插入字符(sic → sick)

  • 转置两个相邻字符(act → cat)

为了找到相似的术语,fuzzy 查询会在指定的编辑距离内创建一组搜索词的所有可能的变体或扩展。然后查询返回每个扩展的完全匹配。

通过 fuzziness 修改编辑距离。一般使用默认值 AUTO,根据术语的长度生成编辑距离。

例子 1:在 Postman 中,向 ES 服务器发 GET 请求:http://127.0.0.1:9200/student/_search

请求体内容:

 
  1. {

  2. "query": {

  3. "fuzzy": {

  4. "name": {

  5. "value": "zhangsan"

  6. }

  7. }

  8. }

  9. }

模糊查询 name 带有 zhangsan 的数据

结果

 
  1. {

  2. "took": 22,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 3,

  13. "relation": "eq"

  14. },

  15. "max_score": 1.540445,

  16. "hits": [

  17. {

  18. "_index": "student",

  19. "_type": "_doc",

  20. "_id": "1001",

  21. "_score": 1.540445,

  22. "_source": {

  23. "name": "zhangsan",

  24. "nickname": "zhangsan",

  25. "sex": "男",

  26. "age": 30

  27. }

  28. },

  29. {

  30. "_index": "student",

  31. "_type": "_doc",

  32. "_id": "1004",

  33. "_score": 1.3478894,

  34. "_source": {

  35. "name": "zhangsan1",

  36. "nickname": "zhangsan1",

  37. "sex": "女",

  38. "age": 50

  39. }

  40. },

  41. {

  42. "_index": "student",

  43. "_type": "_doc",

  44. "_id": "1005",

  45. "_score": 1.3478894,

  46. "_source": {

  47. "name": "zhangsan2",

  48. "nickname": "zhangsan2",

  49. "sex": "女",

  50. "age": 30

  51. }

  52. }

  53. ]

  54. }

  55. }

例子 2:在 Postman 中,向 ES 服务器发 GET 请求:http://127.0.0.1:9200/student/_search

请求体内容:

 
  1. {

  2. "query": {

  3. "fuzzy": {

  4. "name": {

  5. "value": "zhangsan",

  6. "fuzziness": 2

  7. }

  8. }

  9. }

  10. }

 结果:

 
  1. {

  2. "took": 4,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 3,

  13. "relation": "eq"

  14. },

  15. "max_score": 1.540445,

  16. "hits": [

  17. {

  18. "_index": "student",

  19. "_type": "_doc",

  20. "_id": "1001",

  21. "_score": 1.540445,

  22. "_source": {

  23. "name": "zhangsan",

  24. "nickname": "zhangsan",

  25. "sex": "男",

  26. "age": 30

  27. }

  28. },

  29. {

  30. "_index": "student",

  31. "_type": "_doc",

  32. "_id": "1004",

  33. "_score": 1.3478894,

  34. "_source": {

  35. "name": "zhangsan1",

  36. "nickname": "zhangsan1",

  37. "sex": "女",

  38. "age": 50

  39. }

  40. },

  41. {

  42. "_index": "student",

  43. "_type": "_doc",

  44. "_id": "1005",

  45. "_score": 1.3478894,

  46. "_source": {

  47. "name": "zhangsan2",

  48. "nickname": "zhangsan2",

  49. "sex": "女",

  50. "age": 30

  51. }

  52. }

  53. ]

  54. }

  55. }

11. 多IDs查询

http://127.0.0.1:9200/student/_search

请求体:

 
  1. {

  2. "query": {

  3. "ids" : {

  4. "values" : ["1001", "1004", "1006"]

  5. }

  6. }

  7. }

 结果:

 
  1. {

  2. "took": 4,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 3,

  13. "relation": "eq"

  14. },

  15. "max_score": 1.0,

  16. "hits": [

  17. {

  18. "_index": "student",

  19. "_type": "_doc",

  20. "_id": "1001",

  21. "_score": 1.0,

  22. "_source": {

  23. "name": "zhangsan",

  24. "nickname": "zhangsan",

  25. "sex": "男",

  26. "age": 30

  27. }

  28. },

  29. {

  30. "_index": "student",

  31. "_type": "_doc",

  32. "_id": "1004",

  33. "_score": 1.0,

  34. "_source": {

  35. "name": "zhangsan1",

  36. "nickname": "zhangsan1",

  37. "sex": "女",

  38. "age": 50

  39. }

  40. },

  41. {

  42. "_index": "student",

  43. "_type": "_doc",

  44. "_id": "1006",

  45. "_score": 1.0,

  46. "_source": {

  47. "name": "zhangsan222",

  48. "nickname": "zhangsan222",

  49. "sex": "女",

  50. "age": 30

  51. }

  52. }

  53. ]

  54. }

  55. }

12. 前缀查询

http://127.0.0.1:9200/student/_search

请求体内容:

 
  1. {

  2. "query": {

  3. "prefix": {

  4. "name": {

  5. "value": "zhangsan"

  6. }

  7. }

  8. }

  9. }

 13. 单字段排序

sort 可以让我们按照不同的字段进行排序,并且通过 order 指定排序的方式。desc 降序,asc 升序。

在 Postman 中,向 ES 服务器发 GET 请求:http://127.0.0.1:9200/student/_search

 
  1. {

  2. "query": {

  3. "match": {

  4. "name":"zhangsan"

  5. }

  6. },

  7. "sort": [{

  8. "age": {

  9. "order":"desc"

  10. }

  11. }]

  12. }

14. 多字段排序

假定我们想要结合使用 age 和 _score 进行查询,并且匹配的结果首先按照年龄排序,然后按照相关性得分排序

在 Postman 中,向 ES 服务器发 GET 请求:http://127.0.0.1:9200/student/_search

 
  1. {

  2. "query": {

  3. "match_all": {}

  4. },

  5. "sort": [

  6. {

  7. "age": {

  8. "order": "desc"

  9. }

  10. },

  11. {

  12. "_score":{

  13. "order": "desc"

  14. }

  15. }

  16. ]

  17. }

结果:

 
  1. {

  2. "took": 17,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 6,

  13. "relation": "eq"

  14. },

  15. "max_score": null,

  16. "hits": [

  17. {

  18. "_index": "student",

  19. "_type": "_doc",

  20. "_id": "1004",

  21. "_score": 1.0,

  22. "_source": {

  23. "name": "zhangsan1",

  24. "nickname": "zhangsan1",

  25. "sex": "女",

  26. "age": 50

  27. },

  28. "sort": [

  29. 50,

  30. 1.0

  31. ]

  32. },

  33. {

  34. "_index": "student",

  35. "_type": "_doc",

  36. "_id": "1003",

  37. "_score": 1.0,

  38. "_source": {

  39. "name": "wangwu",

  40. "nickname": "wangwu",

  41. "sex": "女",

  42. "age": 40

  43. },

  44. "sort": [

  45. 40,

  46. 1.0

  47. ]

  48. },

  49. {

  50. "_index": "student",

  51. "_type": "_doc",

  52. "_id": "1001",

  53. "_score": 1.0,

  54. "_source": {

  55. "name": "zhangsan",

  56. "nickname": "zhangsan",

  57. "sex": "男",

  58. "age": 30

  59. },

  60. "sort": [

  61. 30,

  62. 1.0

  63. ]

  64. },

  65. {

  66. "_index": "student",

  67. "_type": "_doc",

  68. "_id": "1005",

  69. "_score": 1.0,

  70. "_source": {

  71. "name": "zhangsan2",

  72. "nickname": "zhangsan2",

  73. "sex": "女",

  74. "age": 30

  75. },

  76. "sort": [

  77. 30,

  78. 1.0

  79. ]

  80. },

  81. {

  82. "_index": "student",

  83. "_type": "_doc",

  84. "_id": "1006",

  85. "_score": 1.0,

  86. "_source": {

  87. "name": "zhangsan222",

  88. "nickname": "zhangsan222",

  89. "sex": "女",

  90. "age": 30

  91. },

  92. "sort": [

  93. 30,

  94. 1.0

  95. ]

  96. },

  97. {

  98. "_index": "student",

  99. "_type": "_doc",

  100. "_id": "1002",

  101. "_score": 1.0,

  102. "_source": {

  103. "name": "lisi",

  104. "nickname": "lisi",

  105. "sex": "男",

  106. "age": 20

  107. },

  108. "sort": [

  109. 20,

  110. 1.0

  111. ]

  112. }

  113. ]

  114. }

  115. }

15 . 高亮查询

在进行关键字搜索时,搜索出的内容中的关键字会显示不同的颜色,称之为高亮。

在使用 match 查询的同时,加上一个 highlight 属性:

  • pre_tags:前置标签
  • post_tags:后置标签
  • fields:需要高亮的字段
  • title:这里声明 title 字段需要高亮,后面可以为这个字段设置特有配置,也可以为空

在 Postman 中,向 ES 服务器发 GET 请求:http://127.0.0.1:9200/student/_search

请求体内容:

 
  1. {

  2. "query": {

  3. "match": {

  4. "name": "zhangsan"

  5. }

  6. },

  7. "highlight": {

  8. "pre_tags": "<font color='red'>",

  9. "post_tags": "</font>",

  10. "fields": {

  11. "name": {}

  12. }

  13. }

  14. }

 分词查询 name 为 zhangsan,并给 zhangsan 高亮红色

 结果:

 
  1. {

  2. "took": 27,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 1,

  13. "relation": "eq"

  14. },

  15. "max_score": 1.540445,

  16. "hits": [

  17. {

  18. "_index": "student",

  19. "_type": "_doc",

  20. "_id": "1001",

  21. "_score": 1.540445,

  22. "_source": {

  23. "name": "zhangsan",

  24. "nickname": "zhangsan",

  25. "sex": "男",

  26. "age": 30

  27. },

  28. "highlight": {

  29. "name": [

  30. "<font color='red'>zhangsan</font>"

  31. ]

  32. }

  33. }

  34. ]

  35. }

  36. }

16. 分页查询

rom:当前页的起始索引,默认从 0 开始。 from = (pageNum - 1) * size

size:每页显示多少条

在 Postman 中,向 ES 服务器发 GET 请求:http://127.0.0.1:9200/student/_search

请求体内容:

 
  1. {

  2. "query": {

  3. "match_all": {}

  4. },

  5. "sort": [

  6. {

  7. "age": {

  8. "order": "desc"

  9. }

  10. }

  11. ],

  12. "from": 0,

  13. "size": 2

  14. }

结果:

 
  1. {

  2. "took": 5,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 6,

  13. "relation": "eq"

  14. },

  15. "max_score": null,

  16. "hits": [

  17. {

  18. "_index": "student",

  19. "_type": "_doc",

  20. "_id": "1004",

  21. "_score": null,

  22. "_source": {

  23. "name": "zhangsan1",

  24. "nickname": "zhangsan1",

  25. "sex": "女",

  26. "age": 50

  27. },

  28. "sort": [

  29. 50

  30. ]

  31. },

  32. {

  33. "_index": "student",

  34. "_type": "_doc",

  35. "_id": "1003",

  36. "_score": null,

  37. "_source": {

  38. "name": "wangwu",

  39. "nickname": "wangwu",

  40. "sex": "女",

  41. "age": 40

  42. },

  43. "sort": [

  44. 40

  45. ]

  46. }

  47. ]

  48. }

  49. }

17. 聚合查询

聚合允许使用者对 es 文档进行统计分析,类似与关系型数据库中的 group by,当然还有很多其他的聚合,例如取最大值、平均值等等。

聚合查询 aggs 字段,该字段里的第一个字段是自定义名字,一个聚合/分组需要另一个聚合/分组需要用到自定义名字(嵌套查询)。第二个字段是聚合查询类型。查询结果不仅有聚合结果,也有设计到的详细数据。

结果长度 size 字段和 aggs 字段同级,代表只获取聚合结果,不获取涉及到的详细数据。

http://127.0.0.1:9200/student/_search

请求体内容:

 
  1. {

  2. "aggs" : {//聚合操作

  3. "price_group":{ //名称,随意起名

  4. "terms":{ //分组操作

  5. "field":"age" //分组字段

  6. }

  7. }

  8. },

  9. "size":0

  10. }

注:如果想求price的平均值,将terms改为avg

服务器响应结果:

结果:

 
  1. {

  2. "took": 24,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 6,

  13. "relation": "eq"

  14. },

  15. "max_score": null,

  16. "hits": []

  17. },

  18. "aggregations": {

  19. "price_group": {

  20. "doc_count_error_upper_bound": 0,

  21. "sum_other_doc_count": 0,

  22. "buckets": [

  23. {

  24. "key": 30,

  25. "doc_count": 3

  26. },

  27. {

  28. "key": 20,

  29. "doc_count": 1

  30. },

  31. {

  32. "key": 40,

  33. "doc_count": 1

  34. },

  35. {

  36. "key": 50,

  37. "doc_count": 1

  38. }

  39. ]

  40. }

  41. }

  42. }

简单聚合

  • 对某个字段取最大值 max

在 Postman 中,向 ES 服务器发 GET 请求:http://127.0.0.1:9200/student/_search

请求体内容:

 
  1. {

  2. "aggs":{

  3. "max_age":{ // 自定义名字

  4. "max":{"field":"age"}

  5. }

  6. },

  7. "size":0 // 只获取聚合结果,不获取每一个数据

  8. }

结果:

 
  1. {

  2. "took": 3,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 6,

  13. "relation": "eq"

  14. },

  15. "max_score": null,

  16. "hits": []

  17. },

  18. "aggregations": {

  19. "max_age": {

  20. "value": 50.0

  21. }

  22. }

  23. }

  • 对某个字段取最小值 min

在 Postman 中,向 ES 服务器发 GET 请求:http://127.0.0.1:9200/student/_search

 
  1. {

  2. "aggs":{

  3. "min_age":{ // 自定义名字

  4. "min":{"field":"age"}

  5. }

  6. },

  7. "size":0 // 只获取聚合结果,不获取每一个数据

  8. }

  • 对某个字段求和 sum

在 Postman 中,向 ES 服务器发 GET 请求:http://127.0.0.1:9200/student/_search

请求体内容:

 
  1. {

  2. "aggs":{

  3. "sum_age":{ // 自定义名字

  4. "sum":{"field":"age"}

  5. }

  6. },

  7. "size":0 // 只获取聚合结果,不获取每一个数据

  8. }

  • 对某个字段取平均值 avg

在 Postman 中,向 ES 服务器发 GET 请求:http://127.0.0.1:9200/student/_search

 
  1. {

  2. "aggs":{

  3. "avg_age":{ // 自定义名字

  4. "avg":{"field":"age"}

  5. }

  6. },

  7. "size":0 // 只获取聚合结果,不获取每一个数据

  8. }

  • 对某个字段的值进行去重之后再取总数

在 Postman 中,向 ES 服务器发 GET 请求:http://127.0.0.1:9200/student/_search

 
  1. {

  2. "aggs":{

  3. "distinct_age":{ // 自定义名字

  4. "cardinality":{"field":"age"}

  5. }

  6. },

  7. "size":0 // 只获取聚合结果,不获取每一个数据

  8. }

  • State 聚合

stats 聚合,对某个字段一次性返回 count,max,min,avg 和 sum 五个指标

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search

 
  1. {

  2. "aggs":{

  3. "stats_age":{ // 自定义名字a

  4. "stats":{"field":"age"}

  5. }

  6. },

  7. "size":0 // 只获取聚合结果,不获取每一个数据

  8. }

结果:

 
  1. {

  2. "took": 5,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 6,

  13. "relation": "eq"

  14. },

  15. "max_score": null,

  16. "hits": []

  17. },

  18. "aggregations": {

  19. "stats_age": {

  20. "count": 6,

  21. "min": 20.0,

  22. "max": 50.0,

  23. "avg": 33.333333333333336,

  24. "sum": 200.0

  25. }

  26. }

  27. }

桶聚合查询

桶聚和相当于 sql 中的 group by 语句

  • terms 聚合,分组统计

在 Postman 中,向 ES 服务器发 GET 请求:http://127.0.0.1:9200/student/_search

 
  1. {

  2. "aggs":{

  3. "age_groupby":{ // 自定义名字

  4. "terms":{"field":"age"}

  5. }

  6. },

  7. "size":0 // 只获取聚合结果,不获取每一个数据

  8. }

结果:

 
  1. {

  2. "took": 1,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 6,

  13. "relation": "eq"

  14. },

  15. "max_score": null,

  16. "hits": []

  17. },

  18. "aggregations": {

  19. "age_groupby": {

  20. "doc_count_error_upper_bound": 0,

  21. "sum_other_doc_count": 0,

  22. "buckets": [

  23. {

  24. "key": 30,

  25. "doc_count": 3

  26. },

  27. {

  28. "key": 20,

  29. "doc_count": 1

  30. },

  31. {

  32. "key": 40,

  33. "doc_count": 1

  34. },

  35. {

  36. "key": 50,

  37. "doc_count": 1

  38. }

  39. ]

  40. }

  41. }

  42. }

  • 嵌套查询

在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search

 
  1. {

  2. "aggs":{

  3. "age_groupby":{ // 自定义名字

  4. "terms":{

  5. "field": "age",

  6. },

  7. "aggs": {

  8. "average_age": {

  9. "avg": {

  10. "field": "age"

  11. }

  12. }

  13. }

  14. }

  15. },

  16. "size":0 // 只获取聚合结果,不获取每一个数据

  17. }

结果:

 
  1. {

  2. "took": 5,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 6,

  13. "relation": "eq"

  14. },

  15. "max_score": null,

  16. "hits": []

  17. },

  18. "aggregations": {

  19. "age_groupby": {

  20. "doc_count_error_upper_bound": 0,

  21. "sum_other_doc_count": 0,

  22. "buckets": [

  23. {

  24. "key": 30,

  25. "doc_count": 3,

  26. "average_age": {

  27. "value": 30.0

  28. }

  29. },

  30. {

  31. "key": 20,

  32. "doc_count": 1,

  33. "average_age": {

  34. "value": 20.0

  35. }

  36. },

  37. {

  38. "key": 40,

  39. "doc_count": 1,

  40. "average_age": {

  41. "value": 40.0

  42. }

  43. },

  44. {

  45. "key": 50,

  46. "doc_count": 1,

  47. "average_age": {

  48. "value": 50.0

  49. }

  50. }

  51. ]

  52. }

  53. }

  54. }

 先对 age 进行分组,分组后进行 求平均值。 例如: age为30的平均值为 30。

  • 在 terms 分组下再进行聚合和排序

这里就用到了自定义的名字,average_age 名代表对 age 取平均值,age_groupby 里先对 age 进行分组,再取平均值并且排序,所以需要 average_age 名。

 
  1. {

  2. "aggs":{

  3. "age_groupby":{ // 自定义名字

  4. "terms":{

  5. "field": "age",

  6. "order": {

  7. "average_age": "desc"

  8. }

  9. },

  10. "aggs": {

  11. "average_age": {

  12. "avg": {

  13. "field": "age"

  14. }

  15. }

  16. }

  17. }

  18. },

  19. "size":0 // 只获取聚合结果,不获取每一个数据

  20. }

 结果:

 
  1. {

  2. "took": 4,

  3. "timed_out": false,

  4. "_shards": {

  5. "total": 1,

  6. "successful": 1,

  7. "skipped": 0,

  8. "failed": 0

  9. },

  10. "hits": {

  11. "total": {

  12. "value": 6,

  13. "relation": "eq"

  14. },

  15. "max_score": null,

  16. "hits": []

  17. },

  18. "aggregations": {

  19. "age_groupby": {

  20. "doc_count_error_upper_bound": 0,

  21. "sum_other_doc_count": 0,

  22. "buckets": [

  23. {

  24. "key": 50,

  25. "doc_count": 1,

  26. "average_age": {

  27. "value": 50.0

  28. }

  29. },

  30. {

  31. "key": 40,

  32. "doc_count": 1,

  33. "average_age": {

  34. "value": 40.0

  35. }

  36. },

  37. {

  38. "key": 30,

  39. "doc_count": 3,

  40. "average_age": {

  41. "value": 30.0

  42. }

  43. },

  44. {

  45. "key": 20,

  46. "doc_count": 1,

  47. "average_age": {

  48. "value": 20.0

  49. }

  50. }

  51. ]

  52. }

  53. }

  54. }

先对 age 进行分组,分组后进行降序排列。然后求平均值。

Elasticsearch入门(三)高级查询操作_明湖起风了的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/69923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux下用文件IO的方式操作GPIO

1.首先查看系统中有没有 “/sys/class/gpio” 这个文件夹。如果没有请在编译内核的时候通过make menuconfig加入。 Device Drivers -> GPIO Support ->/sys/class/gpio/… (sysfs interface)。2./sys/class/gpio 的使用说明 如果是在已经适配好的 Linux 内核上&#xf…

【Vue路由】路由的简介及基本使用

文章目录路由的简介路由的基本使用几个使用路由的注意点组件分类组件去向路由组件路由的简介 再说路由之前&#xff0c;我们先来看看生活中的路由器&#xff0c;它的作用就是让多台设备同时上网&#xff0c;同时每一个接口对应一个网络设备&#xff1a; 我们可以这样来看&am…

面试题分享|Linux定时任务调度机制是怎么回事?

一. 前言 在求职过程中&#xff0c;有过面试经历的小伙伴们都知道&#xff0c;企业对linux的考察还是蛮频繁的。作为java开发程序员&#xff0c;在企业中我们的服务器都是在linux环境中部署的&#xff0c;所以熟练使用linux已经成为企业招聘人才的基本需求。但很多小伙伴在学习…

基于蚁群算法的车辆路径规划问题的研究(Matlab代码实现)

目录 1 概述 1.1研究背景 2 运行结果 3 Matlab代码实现 4 结语 5 参考文献 1 概述 车辆路径规划问题&#xff08;Vehicle Routing Problem,VRP&#xff09;是现代物流配送过程中的关键环节,而且其在众多领域中都有广泛的应用,因此它的提出引起了不同学科的专家和物流管理…

LeetCode HOT 100 —— 146.LRU缓存

题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则返回…

TI Lab_SRR学习_3 速度扩展_1 预备知识

首先先了解一下SRR模式下的chirp配置是什么样子,SRR的chirp的配置文件可以看(位置位于toolbox中)C:\mmwave_automotive_toolbox_3_1_0__win\mmwave_automotive_toolbox_3_1_0\labs\lab0002_short_range_radar\src\commonsrr_config_chirp_design_SRR80.h 通过以上代码可以知…

网络编程套接字——UDP

一、基础知识 1.区分源地址、目的地址 &#xff08;1&#xff09;源IP地址和目的地址&#xff1a;最开始的IP地址与送达数据的地址 &#xff08;2&#xff09;源MAC地址和目的MAC地址&#xff1a;相当于上一站的地址与下一站的地址&#xff0c;在不断地变化 socket通信&#…

数据库专辑--SQL分类汇总(group by...with rollup),增加“总计”字段

系列文章 C#底层库–数据库访问帮助类&#xff08;MySQL版&#xff09; 数据库专辑–WITH CHECK OPTION的用法 文章目录系列文章前言一、概念介绍二、测试用例2.1 创建表2.2 初始化数据2.3 数据查询2.4 分析问题2.5 解决问题2.6 推荐另一种写法&#xff0c;使用COALESCE三、用…

如何撰写品牌故事?品牌故事软文撰写技巧分享

你听过哪些有温度的品牌故事&#xff1f;我首先想到的是香奈儿&#xff1a; 我的生活不曾取悦于我&#xff0c;所以我创造了自己的生活。 这是香奈儿的创始人可可香奈儿给世人留下的一句话&#xff0c;也是她一生的真实写照。 她被后人看作女性解放和独立的一个象征&#xf…

查询网站有没有被搜狗收录复杂吗?查询搜狗收录简单的方法

对于网站收录的概念&#xff0c;互联网中或者搜索引擎中已经有大量的相关定义。网站收录&#xff0c;指的是爬虫爬取了网页&#xff0c;并将页面内容数据放入搜索引擎数据库中这一结果。 查询网站有没有被搜狗收录复杂吗&#xff1f; 用网站批量查询工具呀&#xff01;操作超简…

React高级备忘录(生命周期)class component

须知 什么是生命周期?就像人有生老病死,component也有类似这样的概念,了解生命周期可以让我们知道如何在「对」的时间做「对」的事。 — Lieutenant 过! 常用生命周期 可以分为三大部分 创建component (componentDidMount)更新component(componentDidUpdate)销毁compone…

照一次CT,对人体的伤害有多大?终于有医生肯站出来说实话

CT是一种检查身体的方式&#xff0c;对于这项检查项目&#xff0c;一直有都有不好的传言&#xff0c;有的人听说CT有辐射&#xff0c;而且辐射比较大&#xff0c;所以比较排斥。 也有的人听说频繁做CT会致癌&#xff0c;所以不愿意做&#xff0c;还有的人把CT当作筛查癌症的神器…

Spring从入门到精通(二)

文章目录1.动态代理1.1 概念1.2 jdk动态代理&#xff08;重点&#xff09;1.3 基于子类的动态代理&#xff08;了解&#xff09;2.AOP2.1 概念2.2 springAop — 基于AspectJ技术2.2.1 AspectJ使用&#xff08;XML&#xff09;2.2.2 AspectJ使用&#xff08;注解开发&#xff09…

【数据结构】二叉树的实现OJ练习

文章目录前言(一) 二叉树的接口实现构建二叉树前序遍历中序遍历后序遍历层序遍历二叉树的节点个数二叉树叶子节点个数二叉树第K层节点个数二叉树的高度查找指定节点判断完全二叉树销毁二叉树(二) 二叉树基础OJ练习单值二叉树相同的树另一棵树的子树二叉树的前序遍历二叉树的最大…

[oeasy]python0026_刷新时间_延迟时间_time_sleep_死循环_while_True

刷新时间 回忆上次内容 time 是一个 ​​module​ import 他可以做和时间相关的事情time.time() 得到当前时间戳 time.localtime() 得到本地时间元组local为本地 time.asctime() 得到时间日期字符串asc为ascii 简略的写法为 asc_time time.asctime() 在​​time.asctime()​…

python -- PyQt5(designer)中文详细教程(六)控件1

控件1 控件就像是应⽤这座房⼦的⼀块块砖。PyQt5有很多的控件&#xff0c;⽐如按钮&#xff0c;单选框&#xff0c;滑动条&#xff0c;复选框等 等。在本章&#xff0c;我们将介绍⼀些很有⽤的控 件&#xff1a; QCheckBox &#xff0c; ToggleButton &#xff0c; QSlider &a…

关于JavaScript运算符的学习

关于博主每篇博文的浪漫主义 【“仅此105秒&#xff0c;无法超越的绝美画面!&#xff01;”】 https://www.bilibili.com/video/BV1nW4y1x78x/?share_sourcecopy_web&vd_source385ba0043075be7c24c4aeb4aaa73352 “仅此105秒&#xff0c;无法超越的绝美画面!&#xff01;…

应用案例:有源无源电路协同仿真

01 有源无源电路协同仿真 随着电路系统集成度和信号速率的提高&#xff0c;电路中的电磁场效应越来越明显&#xff0c;单纯使用电路分析方法已不能满足仿真评估精度要求&#xff0c;这种情况下必须对问题进行分解&#xff0c;采用三维电磁场全波方法对信号传播路径上的封装与…

[附源码]计算机毕业设计JAVA在线文献查阅系统

[附源码]计算机毕业设计JAVA在线文献查阅系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

C# 拖放操作

一 拖放操作 拖放操作Drag and Drop是两个窗口之间传递数据的一种手段。 1 拖放操作两部分&#xff1a;拖Drag、放Drop 几个术语&#xff1a; ① 源窗口&#xff1a;发起拖拽StartDrag; ② 目标窗口&#xff1a;接受拖放AcceptDraop; ③ 拖拽物&#xff1a;即传输的数据Dat…