先看下我的数据:
1、查询所有文档:
或者
- GET /cartest/_search
- { "query": { "match_all": {} }}
复制代码 2、匹配查询:
match匹配范例查询,会把查询条件举行分词,然后举行查询,多个词条之间是or的关系
- GET /cartest/_search
- { "query": { "match": { "name": "风云" } }}
复制代码
3、字段匹配查询:
multi_match 与match类似,不同的是它可以在多个字段中查询。
4、关键字精准查询:
这个term查询不对查询条件举行分词,
要是text文本范例就会堕落,keyword可以举行此类查询
这里我们查 name:风云 就什么都没查到
向 cartest 中再加一个keyword范例的class字段
- PUT /cartest/_mapping
- {
- "properties": {
- "class":{
- "type": "keyword",
- "index": true
- }
- }
- }
复制代码
添加一条数据
- POST /cartest/_doc
- {
- "name": "wang",
- "page": "cn",
- "say": "欢迎",
- "time": "2020-12-11",
- "class": "box"
- }
复制代码
我们再次查询:
- GET /cartest/_search
- { "query": { "term": { "class": { "value": "box" } } }}
复制代码
5、多关键字查询:
terms 查询和term 查询一样,但它答应你指定多值举行匹配。
如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件,类似于 mysql 的 in
固然,一定要记得查询的字段为关键字keyword范例,不然查不到内容
- GET /cartest/_search
- { "query": { "terms": { "class": ["box", "box-1"] } }}
复制代码
6、组合查询:
bool把各种其它查询通过must(必须 )、must_not(必须不)、should(应该)的方式举行组合
7、范围查询:
操纵符说明gt大于>gte大于等于>=lt小于<lte小于等于<= 查询 num 100 - 150之间的数据
- GET /cartest/_search
- { "query": { "range": { "num": { "gte": 100, "lte": 150 } } }}
复制代码
查询 04 - 06号之间的数据
8、分页查询+排序:
也可设置多字段排序,主次为代码顺序
- GET /cartest/_search
- { "query": { "match_all": {} }, "sort": [ { "num": { "order": "desc" } } ], "from": 0, "size": 3}
复制代码
固然也可以按时间排序
9、查询需要的字段
- GET /cartest/_search
- { "_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中数值的数目
- GET /cartest/_search
- { "aggs": { "max_age": { "max": { "field": "num" } } }, "size": 0}
复制代码
均匀值:
12、正则查询
- GET /cartest/_search
- { "query": { "bool": { "must": [ { "regexp": { "name": ".*云.*" } } ] } }}
复制代码
13、多层数据查询
- GET /testes/_search
- {
- "query": {
- "match": {
- "fun.active": "进行中"
- }
- }
- }
复制代码
14、nested:嵌套数据范例,可以看成是一个特殊的对象范例,可以让对象数组独立检索
一个例子说明nested范例的作用
(1)Nested:嵌套对象是object数据范例的专用版本,可以或许对 对象数组举行彼此独立地索引和查询。
(2)对象数组默认组织情势
内部对象字段数组的实际存储机制与我们想的不一样。Lucene没有内部对象的概念,因为ElasticSearch将对象条理布局扁平化为一个字段名和字段值的列表。例如下面文档。
- PUT user/_doc/1
- {
- "group" : "man",
- "userName" : [
- {
- "first" : "张",
- "last" : "三"
- },
- {
- "first" : "李",
- "last" : "四"
- }
- ]
- }
复制代码 这里想要查询first为“张”,last为“四”的数据,按照我们的理解应该没有这种数据。按如下语句查询。
- GET /user/_search
- {
- "query":{
- "bool":{
- "must":[
- {
- "match":{
- "userName.first":"张"
- }
- },
- {
- "match":{
- "userName.last":"四"
- }
- }
- ]
- }
- }
- }
复制代码 查询结果如下:居然查询到了。这显然不符合我们的预期。
这个缘故原由就是前面所说的lucene没有内部对象的概念,所谓的内部对象实际是被扁平化为一个简单的字段名称和值列表。文档内部存储是这个样子的:
- {
- "group" : "human",
- "sex" : "man",
- "userName.first" : [ "张", "李" ],
- "userName.last" : [ "三", "四" ]
- }
复制代码 显然 userName.first 和 userName.last 字段平面化为多值字段,之前的关联性丢失,查询就不会得到预期的结果。
那么要如何实现本身想要的语义呢? —— 显然就是本文想要说的nested了。
- // 第一步先声明类型
- PUT order
- {
- "mappings": {
- "properties": {
- "goods_list": {
- "type": "nested",
- "properties": {
- "name": {
- "type": "text"
- }
- }
- }
- }
- }
- }
- // 第二步 添加数据
- PUT /order/_doc/1
- {
- "total_price": 126,
- "goods_list": [
- {
- "name": "xiaomi",
- "price": 30
- },
- {
- "name": "guang",
- "price": 19
- },
- {
- "name": "liang",
- "price": 20
- }
- ]
- }
- // 查询
- GET order/_search
- {
- "query": {
- "bool": {
- "must": [
- {
- "nested": {
- "path": "goods_list",
- "query": {
- "bool": {
- "must": [
- {
- "match": {
- "goods_list.name": "guang"
- }
- },
- {
- "match": {
- "goods_list.price": 20
- }
- }
- ]
- }
- }
- }
- }
- ]
- }
- }
- }
复制代码 这时是查不出来的,符合预期
这样就可以查询到了
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |