Elasticsearch 聚合查询和排序


Posted in Python onApril 19, 2022

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,filter
must  ---  and 
should --- or
must_not --- not
filter --- 过滤
# 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 聚合查询之avg
select 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 聚合之min
GET gyy/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
  "aggs": {
    "my_min": {
      "min": {
        "field": "age"
      }
    }
  },
  "size": 0
}
# 4 聚合查询之sum
GET 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 books
GET 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聚合查询及排序操作示例的详细内容!

Python 相关文章推荐
python getopt 参数处理小示例
Jun 09 Python
python中遍历文件的3个方法
Sep 02 Python
Python fileinput模块使用介绍
Nov 30 Python
解析Python编程中的包结构
Oct 25 Python
Python运算符重载详解及实例代码
Mar 07 Python
好的Python培训机构应该具备哪些条件
May 23 Python
python使用turtle库与random库绘制雪花
Jun 22 Python
Python实现堡垒机模式下远程命令执行操作示例
May 09 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
Feb 26 Python
pycharm安装及如何导入numpy
Apr 03 Python
Python第三方包之DingDingBot钉钉机器人
Apr 09 Python
如何用python开发Zeroc Ice应用
Jan 29 Python
Elasticsearch 基本查询和组合查询
Apr 19 #Python
Elasticsearch 批量操作
Apr 19 #Python
Elasticsearch 数据类型及管理
Apr 19 #Python
Elasticsearch 索引操作和增删改查
Apr 19 #Python
python中redis包操作数据库的教程
Apr 19 #Python
python中pymysql包操作数据库方法
Apr 19 #Python
Python中Schedule模块使用详解 周期任务神器
Apr 19 #Python
You might like
php读取csv文件并输出的方法
2015/03/14 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
2016/05/18 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
2018/05/25 PHP
PHP与Web页面的交互示例详解二
2020/08/04 PHP
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
2011/03/03 Javascript
javascript确认框的三种使用方法
2013/12/17 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
2014/05/02 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
Node.js websocket使用socket.io库实现实时聊天室
2017/02/20 Javascript
解决Vue2.0自带浏览器里无法打开的原因(兼容处理)
2017/07/28 Javascript
NProgress显示顶部进度条效果及使用详解
2019/09/21 Javascript
layui监听select变化,以及设置radio选中的方法
2019/09/24 Javascript
JavaScript使用localStorage存储数据
2019/09/25 Javascript
js实现带箭头的进度流程
2020/03/26 Javascript
如何在微信小程序中使用骨架屏的步骤
2020/06/12 Javascript
详解React的回调渲染模式
2020/09/10 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
2020/10/30 Javascript
Python实现的最近最少使用算法
2015/07/10 Python
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
Python处理JSON数据并生成条形图
2016/08/05 Python
python实现验证码识别功能
2018/06/07 Python
解决Python获取字典dict中不存在的值时出错问题
2018/10/17 Python
Python 用turtle实现用正方形画圆的例子
2019/11/21 Python
Python zip函数打包元素实例解析
2019/12/11 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
2020/04/08 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
2020/08/19 Python
python 删除系统中的文件(按时间,大小,扩展名)
2020/11/19 Python
五年后的职业生涯规划
2014/03/04 职场文书
学生会竞选演讲稿怎么写
2014/08/26 职场文书
教师自查自纠材料
2014/10/14 职场文书
杭州黄龙洞导游词
2015/02/10 职场文书
老乡会致辞
2015/07/28 职场文书
2016幼儿园教师年度考核评语
2015/12/01 职场文书
2016年党员读书月活动总结
2016/04/06 职场文书
SQL Server数据库基本概念、组成、常用对象与约束
2022/03/20 SQL Server
使用python绘制分组对比柱状图
2022/04/21 Python