Elasticsearch扫盲之七:ElasticSearch的搜索_search的基本用法及分页和排序参数说明

ElasticSearch的_search主要是针对各种搜索条件获取搜索结果的API.

一、主要用法

  • 请求方式:GET
  • 请求地址:
    • 不指定index : search
    • 指定index : /{{indexName}}/_search
    • 指定index和type : {{indexName}}/{{typeName}}/_search
  • 请求参数:
    • 通过URL传参数(Query String)
    • 通过请求体传参数
  • 响应结果
    • 正常结果:
      • took : 查询花费的时间(毫秒)
      • timed_out : 查询是否超时
      • _shards : 分片情况
        • total : 总分片数
        • successful : 成功的分片数
        • failed : 失败的分片数
      • hits : 搜索中命中的数据
        • total : 总数据条数
        • max_score : 最高的相关度评分
        • hits : 具体的数据对象
          • _index : 对应的index
          • _type : 对应的type
          • _id : 对应的文档ID
          • _source : 数据实体
          • _score : 相关度评分
    • 异常结果
      • 网络状态码:非200
      • 响应体:
        • error : 错误信息
        • status : 具体的状态码
  1. GET /article/_search

结果如下:

  1. {
  2. "took" : 0,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 5,
  6. "successful" : 5,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : 2,
  12. "max_score" : 1.0,
  13. "hits" : [
  14. {
  15. "_index" : "article",
  16. "_type" : "_doc",
  17. "_id" : "2",
  18. "_score" : 1.0,
  19. "_source" : {
  20. "id" : 2,
  21. "title" : "CAT监控入门",
  22. "content" : "分布式监控工具CAT",
  23. "tags" : [
  24. "CAT",
  25. "监控"
  26. ],
  27. "create_time" : 1554018421008
  28. }
  29. },
  30. {
  31. "_index" : "article",
  32. "_type" : "_doc",
  33. "_id" : "1",
  34. "_score" : 1.0,
  35. "_source" : {
  36. "id" : 1,
  37. "title" : "分布式监控工具CAT极速入门",
  38. "content" : "ElasticSearch单机安装和集群部署",
  39. "tags" : [
  40. "ElasticSearch",
  41. "搜索引擎"
  42. ],
  43. "create_time" : 1554015482530
  44. }
  45. }
  46. ]
  47. }
  48. }

二、通过URL传参搜索查询

URL中支持以下参数:

  • q : 查询条件
  • _source : 字段选择
  • sort : 排序
  • from : 查询的起始位置
  • size : 查询的数据条数
  1. GET /user/_doc/_search?q=status:1&size=5&sort=create_time:desc&_source=user_id,account

注:一般不建议使用URL传参的形式来查询

三、通过请求体传参的方式搜索查询

请求体支持以下参数:

  • 查询条件参数:
    • query : 使用结构化查询语句或SQL来作为查询条件(将在后面重点讲解)
  • 筛选计算参数:
    • _source : 字段选择
    • from : 起始位置(用于分页)
    • size : 获取的数据条数(用于分页)
    • sort : 排序
    • script : 利用脚本查询或计算
    • aggs : 聚合计算
1.字段选择_source
  • 直接指明要返回哪些字段,是一个数组
  • 使用includes指定要包含哪些字段
  • 使用excludes指定排除哪些字段

假如有这样一个结构的文档:

  1. {
  2. "user_id" : 1,
  3. "account" : "shixinke",
  4. "email" : "ishixinke@gmail.com",
  5. "status" : 1,
  6. "nickname" : "诗心客",
  7. "create_time" : 1553936640476
  8. }
(1)指定要查询的字段集合
  1. GET /user/_doc/_search
  2. {
  3. "_source":["user_id","nickname"],
  4. "size":1
  5. }
  • 指定只查询user_id和nickname这两个字段

查询结果:

  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" : 5,
  12. "max_score" : 1.0,
  13. "hits" : [
  14. {
  15. "_index" : "user",
  16. "_type" : "_doc",
  17. "_id" : "1",
  18. "_score" : 1.0,
  19. "_source" : {
  20. "user_id" : 1,
  21. "nickname" : "诗心客"
  22. }
  23. }
  24. ]
  25. }
  26. }
(2)通过includes参数来指定字段集合
  1. GET /user/_doc/_search
  2. {
  3. "_source":{
  4. "includes":["user_id", "email"]
  5. },
  6. "size":1
  7. }
  • 指定只查询user_id和email这两个字段

查询结果:

  1. {
  2. "took" : 0,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : 5,
  12. "max_score" : 1.0,
  13. "hits" : [
  14. {
  15. "_index" : "user",
  16. "_type" : "_doc",
  17. "_id" : "1",
  18. "_score" : 1.0,
  19. "_source" : {
  20. "user_id" : 1,
  21. "email" : "ishixinke@gmail.com"
  22. }
  23. }
  24. ]
  25. }
  26. }
(3)通过excludes参数来指定排除的字段集合
  1. GET /user/_doc/_search
  2. {
  3. "_source":{
  4. "excludes":["status", "create_time"]
  5. },
  6. "size":1
  7. }
  • 指定只查询除status和create_time这两个字段之外的其他字段

查询结果:

  1. {
  2. "took" : 0,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : 5,
  12. "max_score" : 1.0,
  13. "hits" : [
  14. {
  15. "_index" : "user",
  16. "_type" : "_doc",
  17. "_id" : "1",
  18. "_score" : 1.0,
  19. "_source" : {
  20. "user_id" : 1,
  21. "nickname" : "诗心客",
  22. "account" : "shixinke",
  23. "email" : "ishixinke@gmail.com"
  24. }
  25. }
  26. ]
  27. }
  28. }
2.分页参数说明

分页主要是通过from和size来决定,from是一个偏移量,size是每页显示的数量

  1. GET /user/_doc/_search
  2. {
  3. "from":2,
  4. "size":3
  5. }
3.排序参数说明

用于排序的字段的数据类型只能是:boolean,numeric,keyword,date

排序是通过sort参数来实现的,针对的是每个排序字段,其格式如下:

简要格式:

  1. {
  2. "sort":[
  3. {"sortField1":"asc"},
  4. {"sortField2":"desc"}
  5. ]
  6. }

复杂格式:

  1. {
  2. "sort":[
  3. {"sortField":{"order":"asc|desc", "mode":"min"}}
  4. ]
  5. }

参数详解:

  • order : 表示排序的方式
    • asc : 长序排序
    • desc : 降序排序
  • mode : 针对一个字段多个值的情况,使用哪种模式来排序
    • min : 多个值中选择最小的值
    • max : 多个值中选择最大的值
    • sum : 将多个值的和作为排序值
    • avg : 将多个值的平均数作为排序值
    • median : 将多个值的中位数的值作为排序值
  1. GET /user/_doc/_search
  2. {
  3. "from":0,
  4. "size":10,
  5. "sort":[
  6. {"create_time":"desc"},
  7. {"status":"asc"}
  8. ]
  9. }