ElasticSearch:查询操纵合集

打印 上一主题 下一主题

主题 1070|帖子 1070|积分 3210

先看下我的数据:

1、查询所有文档:
  1. GET /cartest/_search
复制代码
或者
  1. GET /cartest/_search
  2. {  "query": {    "match_all": {}  }}
复制代码
2、匹配查询:
   match匹配范例查询,会把查询条件举行分词,然后举行查询,多个词条之间是or的关系
  1. GET /cartest/_search
  2. {  "query": {    "match": {      "name": "风云"    }  }}
复制代码

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

4、关键字精准查询:
   这个term查询不对查询条件举行分词,
要是text文本范例就会堕落,keyword可以举行此类查询
  这里我们查 name:风云 就什么都没查到

向 cartest 中再加一个keyword范例的class字段
  1. PUT /cartest/_mapping
  2. {
  3.          "properties": {
  4.                  "class":{
  5.                          "type": "keyword",
  6.                          "index": true
  7.                  }
  8.          }
  9. }
复制代码

添加一条数据
  1. POST /cartest/_doc
  2. {
  3.   "name": "wang",
  4.   "page": "cn",
  5.   "say": "欢迎",
  6.   "time": "2020-12-11",
  7.   "class": "box"
  8. }
复制代码

我们再次查询:
  1. GET /cartest/_search
  2. {   "query": {     "term": {       "class": {        "value": "box"       }     }   }}
复制代码

5、多关键字查询:
   terms 查询和term 查询一样,但它答应你指定多值举行匹配。
如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件,类似于 mysql 的 in
固然,一定要记得查询的字段为关键字keyword范例,不然查不到内容
  1. GET /cartest/_search
  2. {   "query": {     "terms": {       "class": ["box", "box-1"]     }   }}
复制代码

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

7、范围查询:
操纵符说明gt大于>gte大于等于>=lt小于<lte小于等于<= 查询 num 100 - 150之间的数据
  1. GET /cartest/_search
  2. {  "query": {   "range": {     "num": {       "gte": 100,       "lte": 150     }   }  }}
复制代码

查询 04 - 06号之间的数据

8、分页查询+排序:
也可设置多字段排序,主次为代码顺序
  1. GET /cartest/_search
  2. {  "query": {    "match_all": {}  },  "sort": [    {      "num": {        "order": "desc"      }    }  ],  "from": 0,  "size": 3}
复制代码

固然也可以按时间排序

9、查询需要的字段
  1. GET /cartest/_search
  2. {  "_source": ["name", "time", "num"],  "query": {    "match_all": {}  },  "sort": [    {      "time": {        "order": "desc"      }    }  ],  "from": 0,  "size": 3}
复制代码

10、过滤查询:
   includes:来指定想要显示的字段
excludes:来指定不想要显示的字段
  只显示 name time 字段

不显示 name time 字段

11、聚合查询:
   聚合答应利用者对 es 文档举行统计分析,类似与关系型数据库中的 group by,固然还有很
多其他的聚合,例如取最大值、均匀值等等。
  获取 num 最大值,size是 hits中数值的数目
  1. GET /cartest/_search
  2. {  "aggs": {    "max_age": {      "max": {        "field": "num"      }    }  },  "size": 0}
复制代码

均匀值:

12、正则查询
  1. GET /cartest/_search
  2. {  "query": {    "bool": {      "must": [        {          "regexp": {            "name": ".*云.*"          }        }      ]    }  }}
复制代码

13、多层数据查询
  1. GET /testes/_search
  2. {
  3.   "query": {
  4.     "match": {
  5.       "fun.active": "进行中"
  6.     }
  7.   }
  8. }
复制代码

14、nested:嵌套数据范例,可以看成是一个特殊的对象范例,可以让对象数组独立检索
一个例子说明nested范例的作用
(1)Nested:嵌套对象是object数据范例的专用版本,可以或许对 对象数组举行彼此独立地索引和查询。
(2)对象数组默认组织情势
内部对象字段数组的实际存储机制与我们想的不一样。Lucene没有内部对象的概念,因为ElasticSearch将对象条理布局扁平化为一个字段名和字段值的列表。例如下面文档。
  1. PUT user/_doc/1
  2. {
  3.   "group" : "man",
  4.   "userName" : [
  5.     {
  6.       "first" : "张",
  7.       "last" :  "三"
  8.     },
  9.     {
  10.       "first" : "李",
  11.       "last" :  "四"
  12.     }
  13.   ]
  14. }
复制代码
这里想要查询first为“张”,last为“四”的数据,按照我们的理解应该没有这种数据。按如下语句查询。
  1. GET /user/_search
  2. {
  3. "query":{
  4.     "bool":{
  5.     "must":[
  6.       {
  7.         "match":{
  8.           "userName.first":"张"
  9.         }
  10.       },
  11.       {
  12.         "match":{
  13.           "userName.last":"四"
  14.         }
  15.       }
  16.     ]
  17.    }
  18. }
  19. }
复制代码
查询结果如下:居然查询到了。这显然不符合我们的预期。

这个缘故原由就是前面所说的lucene没有内部对象的概念,所谓的内部对象实际是被扁平化为一个简单的字段名称和值列表。文档内部存储是这个样子的:
  1. {
  2.   "group" :        "human",
  3.   "sex" :          "man",
  4.   "userName.first" : [ "张", "李" ],
  5.   "userName.last" :  [ "三", "四" ]
  6. }
复制代码
显然 userName.first 和 userName.last 字段平面化为多值字段,之前的关联性丢失,查询就不会得到预期的结果。
那么要如何实现本身想要的语义呢? —— 显然就是本文想要说的nested了。
  1. // 第一步先声明类型
  2. PUT order
  3. {
  4.   "mappings": {
  5.     "properties": {
  6.       "goods_list": {
  7.         "type": "nested",
  8.         "properties": {
  9.           "name": {
  10.             "type": "text"
  11.           }
  12.         }
  13.       }
  14.     }
  15.   }
  16. }
  17. // 第二步 添加数据
  18. PUT /order/_doc/1
  19. {
  20.   "total_price": 126,
  21.   "goods_list": [
  22.     {
  23.       "name": "xiaomi",
  24.       "price": 30
  25.     },
  26.     {
  27.       "name": "guang",
  28.       "price": 19
  29.     },
  30.     {
  31.       "name": "liang",
  32.       "price": 20
  33.     }
  34.   ]
  35. }
  36. // 查询
  37. GET order/_search
  38. {
  39.   "query": {
  40.     "bool": {
  41.       "must": [
  42.         {
  43.           "nested": {
  44.             "path": "goods_list",
  45.             "query": {
  46.               "bool": {
  47.                 "must": [
  48.                   {
  49.                     "match": {
  50.                       "goods_list.name": "guang"
  51.                     }
  52.                   },
  53.                   {
  54.                     "match": {
  55.                       "goods_list.price": 20
  56.                     }
  57.                   }
  58.                 ]
  59.               }
  60.             }
  61.           }
  62.         }
  63.       ]
  64.     }
  65.   }
  66. }
复制代码
这时是查不出来的,符合预期

这样就可以查询到了


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表