返回顶部
首页 > 资讯 > 精选 >Elasticsearch聚合查询及排序的方法
  • 780
分享到

Elasticsearch聚合查询及排序的方法

2023-06-30 05:06:08 780人浏览 独家记忆
摘要

这篇“elasticsearch聚合查询及排序的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Elasticsearch

这篇“elasticsearch聚合查询及排序的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Elasticsearch聚合查询及排序的方法”文章吧。

1 es排序

# 1 排序GET jeff/doc/_search{  "query": {    "match": {      "from": "gu"    }  },   "sort": [    {      "age": {        "order": "desc"      }    }  ]}# 升序GET jeff/doc/_search{  "query": {    "match": {      "from": "gu"    }  },   "sort": [    {      "age": {        "order": "asc"      }    }  ]}# 并不是所有类型都支持排序(只允许数字类型做排序)GET jeff/doc/_search{  "query": {    "match": {      "from": "gu"    }  },   "sort": [    {      "name": {        "order": "asc"      }    }  ]}

2 match和match的区别

# match和match_all的区别?Mach表示要查询,根据字段查,match_all查所有GET jeff/doc/_search{  "query": {    "match_all": {}  }}

3 分页查询

GET jeff/doc/_search{  "query": {    "match_all": {}  },  "sort": [    {      "age": {        "order": "desc"      }    }  ],   "from": 2,  "size": 1}#   "from": 2,代表从第二条开始, 取一条"size": 1# 有了这个查询,如何分页?一页有10条数据第一页:  "from": 0,  "size": 10第二页:  "from": 10,  "size": 10第三页:  "from": 20,  "size": 10

4 es 组合查询

# 多个条件,and ,or ,not# 对到es中就是布尔查询,must,should,must_not,filtermust  ---  and should --- ORMust_not --- notfilter --- 过滤# 1 组合查询之must# 查询form gu和age=30的数据GET gyy/doc/_search{  "query": {    "bool": {      "must": [        {          "match": {            "from": "gu"          }        },        {          "match": {            "age": "30"          }        }      ]    }  }}# 查询form gu数据()GET gyy/doc/_search{  "query": {    "bool": {      "must": [        {          "match": {            "from": "gu"          }        }      ]    }  }}# 同上GET gyy/doc/_search{  "query": {    "match": {      "from": "gu"    }  }}# 2 组合查询之should,或者的条件GET gyy/doc/_search{  "query": {    "bool": {      "should": [        {          "match": {            "from": "gu"          }        },        {          "match": {            "tags": "闭月"          }        }      ]    }  }}# 3 组合查询之must_not  取反GET gyy/doc/_search{  "query": {    "bool": {      "must_not": [        {          "match": {            "from": "gu"          }        },        {          "match": {            "tags": "可爱"          }        },        {          "match": {            "age": 18          }        }      ]    }  }}# `filter`条件过滤查询,过滤条件的范围用`range`表示,`gt`表示大于,大于多少呢# gt:大于   lt:小于  get:大于等于   let:小于等于GET gyy/doc/_search{  "query": {    "bool": {      "must": [        {          "match": {            "from": "gu"          }        }      ],      "filter": {        "range": {          "age": {            "gt": 25          }        }      }    }  }}# 查询年龄小于等于18的所有数据GET gyy/doc/_search{  "query": {    "bool": {      "filter": {        "range": {          "age": {            "lte": 18          }        }      }    }  }}

5 结果过滤展示字端

# 对结果进行过滤,类似于如下select * from user;select name,age from user;# 对应到es的查询GET gyy/doc/_search{  "query": {    "match": {      "name": "顾老二"    }  },  "_source": ["name", "age"]}

6 结果高亮展示

# 3 结果高亮显示(默认情况)GET gyy/doc/_search{  "query": {    "match": {      "name": "石头"    }  },  "highlight": {    "fields": {      "name": {}    }  }}# 定制高亮显示的样式GET gyy/chengyuan/_search{  "query": {    "match": {      "from": "gu"    }  },  "highlight": {    "pre_tags": "<b class='key' style='color:red'>",    "post_tags": "</b>",    "fields": {      "from": {}    }  }}

小结:

混合开发,你知道怎么处理

后端分离,你怎么处理?

<b class='key' style='color:red'>串直接以josn格式返回,前端自行渲染

用的最多就是match+布尔+高亮+分页

7 聚合查询avg、max、min、sum、分组

# 聚合查询# 1 聚合查询之avgselect max(age) as my_avg from user;GET gyy/doc/_search{  "query": {    "match": {      "from": "gu"    }  },  "aggs": {    "my_avg": {      "avg": {        "field": "age"      }    }  },  "_source": ["name", "age"]}# 2 聚合查询之max,size=0表示不取数据,只要max的结果GET gyy/doc/_search{  "query": {    "match": {      "from": "gu"    }  },  "aggs": {    "my_max": {      "max": {        "field": "age"      }    }  },  "size": 0}# 3 聚合之minGET gyy/doc/_search{  "query": {    "match": {      "from": "gu"    }  },  "aggs": {    "my_min": {      "min": {        "field": "age"      }    }  },  "size": 0}# 4 聚合查询之sumGET gyy/doc/_search{  "query": {    "match": {      "from": "gu"    }  },  "aggs": {    "my_sum": {      "sum": {        "field": "age"      }    }  },  "size": 0}# 5 聚合之分组GET gyy/doc/_search{  "size": 0,   "query": {    "match_all": {}  },  "aggs": {    "age_group": {      "range": {        "field": "age",        "ranges": [          {            "from": 15,            "to": 20          },          {            "from": 20,            "to": 25          },          {            "from": 25,            "to": 30          }        ]      }    }  }}

8 mapping和_template模版

GET _template/user_instagram  # 查看模版PUT _template/user_instagram  # 修改模版{跟字段信息数据}GET user_instagram/_mapping  # 查看索引信息PUT user_instagram/_mapping  # 修改索引信息{跟字段信息数据}

模版中如果有name字段,存的时候会在索引中自动匹配

模版中如果没有age字段,存的时候索引找不到字段,存不进去。

需要现在模版中添加字段,再到索引中添加字段,索引生成之后需要手动添加字段,不会自动生成
 

# 查看索引信息---》mapping字典---》映射(类型,表类型,表结构)GET user_instagram/_mapping# 6.x以后一个索引只能有一个映射类型(只能有一个表)# 创建映射# 创建索引,并设置映射PUT _template/user_instagram{    "order" : 1,    "index_patterns" : [      "user_instagram-v1_0"    ],    "settings" : {      "index" : {        "default_pipeline" : "auto_timestamp_pipeline",        "mapping" : {          "total_fields" : {            "limit" : "10000"          }        },        "refresh_interval" : "600s",        "number_of_shards" : "8",        "number_of_replicas" : "0",        "max_inner_result_window" : "50000"      }    },    "mappings" : {      "_meta" : {        "software_version_mapping" : "1.0"      },      "dynamic" : "strict",      "properties" : {        "is_private" : {          "type" : "boolean"        },        "full_name" : {          "type" : "text"        },        "create_time" : {          "type" : "date"        },        "avatar_url" : {          "type" : "text"        },        "user_id" : {          "eager_global_ordinals" : true,          "type" : "keyWord"        },        "follower_num" : {          "type" : "integer"        },        "following_num" : {          "type" : "integer"        },        "post_count" : {          "type" : "integer"        },        "nickname" : {          "type" : "text",          "fields" : {            "keyword" : {              "ignore_above" : 256,              "type" : "keyword"            }          },          "doc_values" : false        },        "requested_by_viewer" : {          "type" : "boolean"        },        "is_verified" : {          "type" : "boolean"        },        "followed_by_viewer" : {          "type" : "boolean"        }      }    },    "aliases" : {      "user_instagram" : { }    }  }# 插入测试数据PUT books/_doc/1{  "title":"大头儿子小偷爸爸",  "price":100,    "addr":"北京天安门",  "company":{    "name":"我爱北京天安门",    "company_addr":"我的家在东北松花江傻姑娘",    "employee_count":10  },  "publish_date":"2019-08-19"}PUT books/_doc/2{  "title":"白雪公主和十个小矮人",  "price":"99",  "addr":"黑暗森里",  "company":{    "name":"我的家乡在上海",    "company_addr":"朋友一生一起走",    "employee_count":10  },  "publish_date":"2018-05-19"}PUT books/_doc/3{  "title":"白雪公主和十个小矮人",  "price":"99",  "addr":"黑暗森里",  "age":18}# 查看映射GET booksGET books/_mapping

映射是什么?映射有什么用?  规定了表结构(不是强制的),规定了哪个字段是可以用来全文检索,是否是数字类型,布尔类型

mapping类型一旦确定,以后就不能修改了,但是可以插入字段

9 ik分词

# 全文检索,有了映射,决定了我可以对某个字段做全文检索# es默认分词对英文友好,使用中文分词器(es的插件),ik(作者,中国人,elasticsearch开源社区负责人)# 是es的一个插件(es如何安装插件)#第一种:命令行(内置插件)  bin/elasticsearch-plugin install analysis-smartcn  安装中文分词器#第二种:url安装(第三方插件)  bin/elasticsearch-plugin install https://GitHub.com/medcl/elasticsearch-analysis-ik/releases/download/v7.5.0/elasticsearch-analysis-ik-7.5.0.zip#第三种:手动安装(推荐用)  #下载,解压到es的plugins路径下,重启es即可  #注意:ik分词器跟es版本一定要对应# 两种分词方式  # ik_smart:分词分的  # ik_max_word :分词分的多  # ik_smart分的词少,粒度大  GET _analyze  {    "analyzer": "ik_smart",    "text": "上海自来水来自海上"  }  # ik_smart分的词多,粒度小  GET _analyze  {    "analyzer": "ik_max_word",    "text": "上海自来水来自海上"  }# 在创建映射的时候配置# 以后你的操作:#文章标题:ik_max_word#文章内容:ik_smart#摘要#作者#创建时间

10 term和match的区别

# match:我们今天出去玩 ----》分词---》按分词去搜#term:我们今天出去玩---》直接拿着[我们今天出去玩]---&gt;去索引中查询# 查不到内容,直接拿着  python爬虫 去查,因为没有索引,所以查不到GET books/_search{  "query":{    "term":{      "title":"python爬虫"    }  }}# 能查到,而且带Python的都查出来了# Python   爬虫  分了词,分别拿着这两个词去查,带python关键字,带爬虫关键字都能查到GET books/_search{  "query":{    "match":{      "title":"Python爬虫"    }  }}

以上就是关于“Elasticsearch聚合查询及排序的方法”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Elasticsearch聚合查询及排序的方法

本文链接: https://lsjlt.com/news/327538.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作