ElasticSearch - 结果处理

news2024/9/20 10:57:08

目录

结果处理-排序

结果处理-分页

结果处理-高亮


  • 结果处理-排序

  • elasticsearch默认是根据相关度算分(_score)来排序,但是也支持自定义方式对搜索结果排序
  • 可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等
  • 普通字段排序
  • keyword、数值、日期类型排序的语法基本一致:
  • GET /indexName/_search
  • {
  •   "query": {
  •     "match_all": {}
  •    },
  •   "sort": [
  •    {
  •       "FIELD": "desc" // 排序字段;排序方式ASC、DESC
  •    }
  •   ]
  • }
  • 排序条件是一个数组,也就是可以写多个排序条件
  • 按照声明的顺序,当第一个条件相等时,再按照第二个条件排序,以此类推
  • 案例:
  • 需求描述:酒店数据按照用户评价(score)降序排序,评价相同的按照价格(price)升序排序

  • 地理坐标排序
  • GET /indexName/_search
  • {
  •   "query": {
  •      "match_all": {}
  •    },
  •    "sort": [
  •     {
  •       "_geo_distance" : {
  •          "FIELD" : "纬度,经度", // 文档中geo_point类型的字段名、目标坐标点
  •          "order" : "asc", // 排序方式
  •          "unit" : "km" // 排序的距离单位
  •       }
  •     }
  •   ]
  • }
  • 这个查询的含义是:
    • 指定一个坐标,作为目标点
    • 计算每一个文档中,指定字段(必须是geo_point类型)的坐标到目标点的距离是多少
    • 根据距离排序
  • 案例:
  • 需求描述:实现对酒店数据按照到你的位置坐标的距离升序排序
  • 假设我的位置是:31.034661, 121.612282,寻找我周围距离最近的酒店

  • 结果处理-分页

  • elasticsearch默认情况下只返回top10的数据
  • 而如果要查询更多数据就需要修改分页参数了
  • elasticsearch中通过修改from、size参数来控制要返回的分页结果:
    • from:从第几个文档开始
    • size:总共查询几个文档
  • 类似于mysql中的limit ?, ?
  • 基本的分页
  • GET /hotel/_search
  • {
  •   "query": {
  •     "match_all": {}
  •    },
  •    "from": 0, // 分页开始的位置,默认为0
  •    "size": 10, // 期望获取的文档总数
  •    "sort": [
  •      {"price": "asc"}
  •   ]
  • }
  • 深度分页问题
  • 现在要查询990~1000的数据,查询逻辑要这么写:
  • GET /hotel/_search
  • {
  •   "query": {
  •      "match_all": {}
  •    },
  •   "from": 990, // 分页开始的位置,默认为0
  •    "size": 10, // 期望获取的文档总数
  •    "sort": [
  •      {"price": "asc"}
  •    ]
  • }
  • 这里是查询990开始的数据,也就是第990~第1000条数据
  • 不过,elasticsearch内部分页时,必须先查询0~1000条,然后截取其中的990 ~ 1000的这10条
  • 查询TOP1000,如果es是单点模式,这并无太大影响
  • 但是elasticsearch将来一定是集群,例如某集群有5个节点,要查询TOP1000的数据,并不是每个节点查询200条就可以了
  • 因为节点A的TOP200,在另一个节点可能排到10000名以外了
  • 因此要想获取整个集群的TOP1000,必须先查询出每个节点的TOP1000,汇总结果后,重新排名,重新截取TOP1000
  • 那如果要查询9900~10000的数据呢?
  • 是不是要先查询TOP10000呢?那每个节点都要查询10000条?汇总到内存中?
  • 当查询分页深度较大时,汇总数据过多,对内存和CPU会产生非常大的压力,因此elasticsearch会禁止from+ size超过10000的请求
  • 针对深度分页,ES提供了两种解决方案
    • search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页数据;官方推荐使用的方式
    • scroll:原理将排序后的文档id形成快照,保存在内存;官方已经不推荐使用
  • 小结
  • 分页查询的常见实现方案以及优缺点:
    • from + size:
      • 优点:支持随机翻页
      • 缺点:深度分页问题,默认查询上限(from + size)是10000
      • 场景:百度、京东、谷歌、淘宝这样的随机翻页搜索
    • after search:
      • 优点:没有查询上限(单次查询的size不超过10000)
      • 缺点:只能向后逐页查询,不支持随机翻页
      • 场景:没有随机翻页需求的搜索,例如手机向下滚动翻页
    • scroll:
      • 优点:没有查询上限(单次查询的size不超过10000)
      • 缺点:会有额外内存消耗,并且搜索结果是非实时的
      • 场景:海量数据的获取和迁移;从ES7.1开始不推荐,建议用after search方案
  • 结果处理-高亮

  • 高亮原理
  • 在百度,京东搜索时,关键字会变成红色,比较醒目,这叫高亮显示
  • 高亮显示的实现分为两步:
    • (1)给文档中的所有关键字都添加一个标签,例如<em>标签
    • (2)页面给<em>标签编写CSS样式
  • 实现高亮
  • GET /hotel/_search
  • {
  •   "query": {
  •     "match": {
  •        "FIELD": "TEXT" // 查询条件,高亮一定要使用全文检索查询
  •     }
  •   },
  •   "highlight": {
  •      "fields": { // 指定要高亮的字段
  •        "FIELD": {
  •          "pre_tags": "对应标签", // 用来标记高亮字段的前置标签
  •          "post_tags": "对应标签" // 用来标记高亮字段的后置标签
  •        }
  •      }
  •   }
  • }
  • 注意事项
    • 高亮是对关键字高亮,因此搜索条件必须带有关键字,而不能是范围这样的查询
    • 默认情况下,高亮的字段,必须与搜索指定的字段一致,否则无法高亮
    • 如果要对非搜索字段高亮,则需要添加一个属性:required_field_match=false
  • 示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/182872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch图像分类全流程(五)--图像分类算法精度评估指标

本次我们来学习图像分类算法精度的各种评估指标&#xff1a;precision、recall、accuracy、f1-score、AP、AUC。 首先我们来学一个很重要的概念&#xff0c;混淆矩阵&#xff1a; 1.精确率(Precision)&#xff1a; 指的是所有被判定为正类&#xff08;TPFP&#xff09;中&…

8-Arm PEG-Succinamide Acid,8-Arm PEG-SAA,八臂-聚乙二醇-丁二酸酰胺供应

英文名称&#xff1a;8-Arm PEG-SAA&#xff0c;8-Arm PEG-Succinamide Acid 中文名称&#xff1a;八臂-聚乙二醇-丁二酸酰胺 8-臂PEG-SAA是一种多臂PEG衍生物&#xff0c;在连接到一个六甘油核心的八个臂的每个末端具有羧基。PEG和丁二酰胺酸COOH基团之间存在C3酰胺键。PEG酸…

HTML中引入CSS样式的第一种方式:内联定义方式

<!-- HTML中引入CSS样式的第一种方式&#xff1a;内联定义方式 语法格式&#xff1a; <标签 style"样式名:样式值;样式名:样式值;样式名:样式值;..."></标签> --> <!DOCTYPE html> <html> <head> …

操作系统(day01)

文章目录操作系统的功能和目标1.作为系统资源的管理者&#xff08;从中间往两边看&#xff09;2.作为用户和计算机硬件之间的接口&#xff08;从下往上看&#xff09;操作系统的四大特征共享虚拟异步操作系统的发展与分类手工操作阶段批处理阶段--多道批处理系统分时操作系统实…

基于蜣螂算法的极限学习机(ELM)回归预测-附代码

基于蜣螂算法的极限学习机(ELM)回归预测 文章目录基于蜣螂算法的极限学习机(ELM)回归预测1.极限学习机原理概述2.ELM学习算法3.回归问题数据处理4.基于蜣螂算法优化的ELM5.测试结果6.参考文献7.Matlab代码摘要&#xff1a;本文利用蜣螂算法对极限学习机进行优化&#xff0c;并用…

QT入门与基础控件

目录 一、QT入门 1.1QT简介 1.2经典应用 1.3工程搭建 1.3.1按钮 1.3.2行编辑框 1.3.3简单确定位置 1.4信号与槽机制 二、布局管理器 2.1布局管理器 2.2输出控件 2.3输入控件 2.4按钮 2.5容器 2.5.1Group Box 2.5.2Ccroll Area 2.5.3Tool Box 2.5.4 Tab Wid…

射频脉冲频谱及退敏效应简述

当使用频谱仪测试射频脉冲信号的频谱时&#xff0c;设置不同的RBW可以得到不同的结果&#xff0c;有连续的包络谱和离散的线状谱之分。针对简单的射频脉冲而言&#xff0c;脉冲退敏效应是指&#xff0c;当显示线状谱时&#xff0c;中心载波的幅度将低于脉内平均功率&#xff0c…

网络工程师必修课主流两种方式实现不同VLAN间通信

我们知道默认不同VLAN间数据时不能通信的,想要实现不同VLAN间通信常用的有两种方式: 一、通过三层交换路由功能实现不同VLAN之间的通信 二、通过单臂路由实现不同VLAN之间的通信 1.通过三层SVI虚接口配置路由实现通信: 交换机A的配置 vlan batch 20 30 //创建VLAN20 V…

数据库概念及运算符介绍

文章目录一、介绍概念分类相关术语启动与关闭服务卸载MySQL的管理工具Navicat的下载和安装逻辑结构二、SQL介绍分类语法注释DDLDQL基本查询运算符伪表算术运算符比较运算符等号运算符安全等与运算符不等于运算符空运算符非空运算符最小值最大值运算符BETWEEN AND运算符IN运算符…

操作符详解

文章目录 算术操作符移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用、函数调用和结构成员表达式求值前言 一、算术操作符 - * / % 注意&#xff1a; 1. 除了 % 操作符之外&#xff0c;…

茕茕白兔十二年

白兔子黑兔子 一年一月&#xff1a;孤独 黑兔子主人公孤单一人躺在斐波那契试验田&#xff0c;犹如上帝造出的亚当。ta决定邀请别的兔子跟ta一起抵抗生活中的百无聊赖&#xff0c;就写下了“征友”明信片&#xff0c;并在明信片上畅想了他们在一起美好的“兔生”。 那一年的秋…

29. 两数相除

打卡!!!每日一题 今天给大家带来一道位运算类型的题目 题目描述&#xff1a; 题目示例&#xff1a; 对于这种类型的题目&#xff0c;当题目要求不能使用乘法、除法时&#xff0c;那么则需要我们从移位、或、与、异或等位运算的角度来进行考虑&#xff0c;接下来我带着大家…

Linux 软件安装 YUM管理工具 简单引入

概念引入 &#xff1a;# 首先提出一个问题&#xff0c;我们在 Linux 操作系统中是如何 安装软件的 &#xff1f;&#xff1f;>>>在 Linux 系统中&#xff0c;安装软件是有三种方式>>>第一种 &#xff1a; RPM 管理工具 第二种 &#xff1a; YUM 管理工具第三…

Docker 搭建 LNMP + Wordpress

一、服务器环境 容器操作系统IP地址主要软件nginxCentOS 7172.18.0.10Docker-NginxmysqlCentOS 7172.18.0.20Docker-MysqlmysqlCentOS 7172.18.0.20Docker-Mysql 二、Linux系统基础镜像 systemctl stop firewalld setenforce 0 docker pull centos:7 #从公有仓库中下载cento…

GB28181开源项目WVP部署详细流程

开箱即用的的28181协议视频平台 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HcH0Aobk-1674895367480)(null)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EmrNYHcL-1674895367646)(null)] [外链图片转存失败,源站可…

手写线程池

为什么要使用线程池? 降低资源的消耗&#xff0c;降低线程创建和销毁的资源消耗&#xff1b;降低响应速度&#xff1a;线程的创建时间为T1&#xff0c;执行时间T2&#xff0c;销毁时间T3&#xff0c;免去T1和T3的时间&#xff1b;提高线程的可管理性 线程池的核心思想&#x…

【从零带你玩转Linux】权限及相关指令

前言 &#x1f3e0;个人主页&#xff1a;泡泡牛奶 &#x1f335;系列专栏&#xff1a;从零带你玩转Linux 本期将会让大家了解什么是权限&#xff0c;权限该如何理解&#xff0c;以及Linux中一些有关权限设置的指令操作&#xff0c;让你在Linux使用中更加得心应手(&#xff5e;&…

Git详细使用文档

Git 1.项目存在哪些问题 1.项目安全性太低2.项目很难协同开发3.项目无端报错4.项目版本混乱 2.Git概念 Git是一个分布式的版本控制及协同开发工具 3.版本控制工具分类 3.1.集中式版本控制工具 cvs svn ​ 集中式版本控制系统&#xff0c;版本库是集中存放在中央服务器的&am…

LeetCode 刷题系列 -- 143. 重排链表

给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a;L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为&#xff1a;L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。示例 1&a…

深度卷积神经网络、池化层、为什么使用卷积、残差网络

目录1.深度卷积神经网络(a deep convolutional neural network)输入图像的维度是&#xff0c;如果&#xff0c;计算输出图像维度公式&#xff1a;。s表示步幅&#xff0c;p表示填充的层数。filters的通道数是和输入图像的通道数保持一致的。分析上图案例&#xff1a;第一层卷积…