袁庭新ES系列12节 | Elasticsearch高级查询操作

前言

上篇文章讲了关于Elasticsearch的基本查询操作。接下来袁老师为大家带来Elasticsearch高级查询部分相关的内容。Elasticsearch是基于JSON提供完整的查询DSL(Domain Specific Language:领域特定语言)来定义查询。因此,我们有必要在专题模块来详细探讨Elasticsearch高级查询部分内容。

我们先来做个热身,了解下这一小节学习的目标,我将带领大家从以下五个模块来学习Elasticsearch的高级查询相关技术。

  • 结果过滤查询
  • 条件过滤查询
  • 结果排序
  • 分页查询
  • 高亮显示

一. 结果过滤查询

默认情况下,Elasticsearch在搜索的结果中,会把文档中保存在_source的所有字段都返回。

如果我们只想获取其中的部分字段,我们可以添加_source属性来进行过滤。

1.直接指定字段

演示示例:

GET /yx/_search
{
  "_source": ["title", "price"],
  "query": {
    "term": {
      "price": 2699
    }
  }
}

语法说明:在查询结构中,通过_source属性来指定查询结果集中需要保留哪些字段信息。

响应结果:

{
  "took": 90,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "lNC7KYUB35ub5htYEZMU",
        "_score": 1,
        "_source": {
          "price": 2699,
          "title": "小米手机"
        }
      }
    ]
  }
}

运行上述代码响应结果见下:

2.指定includes和excludes

我们也可以通过:

属性

描述

includes

来指定想要显示的字段

excludes

来指定不想要显示的字段

注意:二者都是可选的。

演示示例:

GET /yx/_search
{
  "_source": {
    "includes": ["title", "images"]
  },
  "query": {
    "term": {
      "price": 2699
    }
  }
}

响应结果:

{
  "took": 148,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "lNC7KYUB35ub5htYEZMU",
        "_score": 1,
        "_source": {
          "images": "http://image.yx.com/12479122.jpg",
          "title": "小米手机"
        }
      }
    ]
  }
}

运行上述代码响应结果见下:

下面的示例与上面的结果将是一样的:

GET /yx/_search
{
  "_source": {
    "excludes": ["price"]
  },
  "query": {
    "term": {
      "price": 2699
    }
  }
}

响应结果:

{
  "took": 6,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "lNC7KYUB35ub5htYEZMU",
        "_score": 1,
        "_source": {
          "images": "http://image.yx.com/12479122.jpg",
          "title": "小米手机"
        }
      }
    ]
  }
}

运行上述代码响应结果见下:

二. filter过滤

Elasticsearch使用的查询语言(DSL)拥有一套查询组件,这些组件可以以无限组合的方式进行搭配。这套组件可以在以下两种情况下使用:过滤情况(filtering context)和查询情况(query context)。

如何选择查询与过滤?通常的规则是,使用查询(query)语句来进行全文搜索或者其它任何需要影响相关性得分的搜索。 除此以外的情况都使用过滤(filters)。

1.条件查询中进行过滤

所有的查询都会影响到文档的评分及排名。如果我们需要在查询结果中进行过滤,并且不希望过滤条件影响评分,那么就不要把过滤条件作为查询条件来用。而是使用filter方式:

GET /yx/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "title": "小米手机"
        }
      },
      "filter": {
        "range": {
          "price": {
            "gt": 2000.00, 
            "lt": 3800.00
          }
        }
      }
    }
  }
}

响应结果:

{
  "took": 71,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 1.1143606,
    "hits": [
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "lNC7KYUB35ub5htYEZMU",
        "_score": 1.1143606,
        "_source": {
          "title": "小米手机",
          "images": "http://image.yx.com/12479122.jpg",
          "price": 2699
        }
      },
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "1",
        "_score": 0.2876821,
        "_source": {
          "title": "大米手机",
          "images": "http://image.yx.com/12479122.jpg",
          "price": 2899
        }
      }
    ]
  }
}

运行上述代码响应结果见下:

2.无查询条件直接过滤

如果一次查询只有过滤,没有查询条件,不希望进行评分,我们可以使用constant_score取代只有filter语句的bool查询。在性能上是完全相同的,但对于提高查询简洁性和清晰度有很大帮助。

GET /yx/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "price": {
            "gt": 2000.00, 
            "lt": 3800.00
          }
        }
      }
    }
  }
}

响应结果:

{
  "took": 16,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 1,
    "hits": [
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "lNC7KYUB35ub5htYEZMU",
        "_score": 1,
        "_source": {
          "title": "小米手机",
          "images": "http://image.yx.com/12479122.jpg",
          "price": 2699
        }
      },
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "1",
        "_score": 1,
        "_source": {
          "title": "大米手机",
          "images": "http://image.yx.com/12479122.jpg",
          "price": 2899
        }
      }
    ]
  }
}

运行上述代码响应结果见下:

三. 结果排序

1.单字段排序

sort可以让我们按照不同的字段进行排序,并且通过order属性指定排序的方式。

属性

描述

asc

升序排序

desc

降序排序

演示案例:

GET /yx/_search
{
  "query": {
    "match": {
      "title": "小米手机"
    }
  },
  "sort": [
    {
      "price": {
        "order": "desc"
      }
    }
  ]
}

响应结果:

{
  "took": 31,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 5,
    "max_score": null,
    "hits": [
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "4",
        "_score": null,
        "_source": {
          "title": "Apple手机",
          "images": "http://image.yx.com/12479122.jpg",
          "price": 6899
        },
        "sort": [
          6899
        ]
      },
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "2",
        "_score": null,
        "_source": {
          "title": "IPhone手机",
          "images": "http://image.yx.com/12479122.jpg",
          "price": 6299,
          "stock": 200,
          "saleable": true,
          "subTitle": "IPhone 15 Pro"
        },
        "sort": [
          6299
        ]
      },
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "5",
        "_score": null,
        "_source": {
          "title": "小米电视4A",
          "images": "http://images.com",
          "price": 3999
        },
        "sort": [
          3999
        ]
      },
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "1",
        "_score": null,
        "_source": {
          "title": "大米手机",
          "images": "http://image.yx.com/12479122.jpg",
          "price": 2899
        },
        "sort": [
          2899
        ]
      },
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "lNC7KYUB35ub5htYEZMU",
        "_score": null,
        "_source": {
          "title": "小米手机",
          "images": "http://image.yx.com/12479122.jpg",
          "price": 2699
        },
        "sort": [
          2699
        ]
      }
    ]
  }
}

2.多字段排序

假定我们想要结合使用price和_score(得分)进行查询,并且匹配的结果首先按照价格排序,然后再按照相关性得分降序排序:

GET /yx/_search
{
  "query": {
    "bool": {
      "must": { 
        "match": { 
          "title": "小米手机" 
        }
      },
      "filter": {
        "range": {
          "price": {
            "gt": 2000,
            "lt": 3000
          }
        }
      }
    }
  },
  "sort": [
    { 
      "price": { 
        "order": "desc" 
      }
    },
    { 
      "_score": { 
        "order": "desc" 
      }
    }
  ]
}

响应结果:

{
  "took": 10,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": null,
    "hits": [
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "1",
        "_score": 0.2876821,
        "_source": {
          "title": "大米手机",
          "images": "http://image.yx.com/12479122.jpg",
          "price": 2899
        },
        "sort": [
          2899,
          0.2876821
        ]
      },
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "lNC7KYUB35ub5htYEZMU",
        "_score": 1.1143606,
        "_source": {
          "title": "小米手机",
          "images": "http://image.yx.com/12479122.jpg",
          "price": 2699
        },
        "sort": [
          2699,
          1.1143606
        ]
      }
    ]
  }
}

四. 分页查询

Elasticsearch中数据都存储在分片中,当执行搜索时每个分片独立搜索后,数据再经过整合返回。那么,如果要实现分页查询该怎么办呢?

Elasticsearch的分页与MySQL数据库非常相似,都是指定两个值:

属性

描述

from

目标数据的偏移值(开始位置),默认from为0

size

每页大小

演示案例:

GET /yx/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "price": {
        "order": "desc"
      }
    }
  ],
  "from": 1,
  "size": 3
}

响应结果:

{
  "took": 17,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 5,
    "max_score": null,
    "hits": [
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "2",
        "_score": null,
        "_source": {
          "title": "IPhone手机",
          "images": "http://image.yx.com/12479122.jpg",
          "price": 6299,
          "stock": 200,
          "saleable": true,
          "subTitle": "IPhone 15 Pro"
        },
        "sort": [
          6299
        ]
      },
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "3",
        "_score": null,
        "_source": {
          "title": "小米电视4A",
          "images": "http://image.yx.com/12479122.jpg",
          "price": 3899
        },
        "sort": [
          3899
        ]
      }
    ]
  }
}

五. 高亮显示

1.高亮显示原理

高亮显示的原理介绍见下:

  • 服务端搜索数据,得到搜索结果。
  • 把搜索结果中,搜索关键字都加上约定好的标签。
  • 前端页面提前写好标签的CSS样式,即可高亮显示。

Elasticsearch中实现高亮的语法比较简单,高亮显示语法格式见下:

GET /索引库名/_search
{
  "query": {
    "match": {
      "字段": "字段值"
    }
  },
  "highlight": {
    "pre_tags": "前置标签",
    "post_tags": "后置标签",
    "fields": {
      "高亮字段名": {}
    }
  }
}

在使用match查询的同时,加上一个highlight属性。highlight属性提供以下属性:

属性

描述

pre_tags

前置标签

post_tags

后置标签

fields

需要高亮的字段(例如这里声明title字段需要高亮)

2.高亮显示案例

演示案例:

GET /yx/_search
{
  "query": {
    "match": {
      "title": "手机"
    }
  },
  "highlight": {
    "pre_tags": "<span>",
    "post_tags": "</span>",
    "fields": {
      "title": {}
    }
  }
}

响应结果:

{
  "took": 19,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "1",
        "_score": 0.2876821,
        "_source": {
          "title": "大米手机",
          "images": "http://image.yx.com/12479122.jpg",
          "price": 2899
        },
        "highlight": {
          "title": [
            "大米<span>手机</span>"
          ]
        }
      },
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "lNC7KYUB35ub5htYEZMU",
        "_score": 0.13353139,
        "_source": {
          "title": "小米手机",
          "images": "http://image.yx.com/12479122.jpg",
          "price": 2699
        },
        "highlight": {
          "title": [
            "小米<span>手机</span>"
          ]
        }
      },
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "2",
        "_score": 0.13353139,
        "_source": {
          "title": "IPhone手机",
          "images": "http://image.yx.com/12479122.jpg",
          "price": 6299,
          "stock": 200,
          "saleable": true,
          "subTitle": "IPhone 15 Pro"
        },
        "highlight": {
          "title": [
            "IPhone<span>手机</span>"
          ]
        }
      },
      {
        "_index": "yx",
        "_type": "goods",
        "_id": "4",
        "_score": 0.13353139,
        "_source": {
          "title": "Apple手机",
          "images": "http://image.yx.com/12479122.jpg",
          "price": 6899
        },
        "highlight": {
          "title": [
            "Apple<span>手机</span>"
          ]
        }
      }
    ]
  }
}

运行上述代码响应结果见下:

六. 结语

关于Elasticsearch高级查询篇相关的内容我们就给大家介绍完了,来复习回顾下这一章节的主要内容。本文从结果过滤查询、结果排序、分页查询、检索查询、关键字查询、高亮显示、过滤查询等几个方面通过实例讲解了Elasticsearch的高级查询。如果还没有掌握的小伙伴,一定要通过文章中大量的案例来进行实操演练从而巩固这一部分知识。下一小节我们将为大家带来Elasticsearch中聚合操作相关的内容。

今天的内容就分享到这里吧。关注「袁庭新」,干货天天都不断!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SAP CAP(Cloud Application Programming)开发框架概述

CAP是什么 SAP云应用编程模型&#xff08;CAP&#xff09;是一个用于构建企业级应用的编程框架。它引导开发人员沿着经过验证的最佳实践的“黄金路径”以及丰富的开箱即用解决方案来构建应用。 与过度专注于技术细节相反&#xff0c;基于CAP的项目主要通过关注快速的业务实现而…

【virtual Box】功能速通:安装 Windows 和 Ubuntu

文章目录 一、虚拟机1.1 概述1.2 virtual box概述 二、新建虚拟机、删除、注册三、虚拟机内部设置3.1 安装增强功能驱动3.2 分辨率问题3.3 网络链接方式 一、虚拟机 1.1 概述 虚拟机&#xff08;Virtual Machine&#xff0c;VM&#xff09;是一种软件实现的计算机系统&#x…

pdf转word文档怎么转?分享4种转换方法

pdf转word文档怎么转&#xff1f;在日常工作中&#xff0c;我们经常遇到需要将PDF文件转换为Word文档的情况。无论是为了编辑、修改还是为了重新排版&#xff0c;将PDF转为Word都显得尤为重要。那么&#xff0c;PDF转Word文档怎么转呢&#xff1f;今天&#xff0c;就为大家分享…

js中的任务处理机制

众所周知(不知道的话去查)&#xff0c;js是以单线程的方式执行的&#xff0c;在执行的过程中&#xff0c;某一时刻上只能执行一个任务&#xff0c;也就是说&#xff0c;我们写好了代码后执行的时候&#xff0c;程序是根据代码从上到下依次排队执行&#xff0c;只有上一个任务执…

ABAP - Function ALV 10 增加表头

有些需求会要求在ALV增加表头&#xff0c;大概长这样 REUSE_ALV_GRID_DISPLAY_LVC制造表头只需要加个传入参数I_CALLBACK_HTML_TOP_OF_PAGE并作处理就好了。 TYPES:BEGIN OF ty_data,sel TYPE char1,light TYPE iconname,name TYPE char10,score TYPE p LENGTH 2 DECIMA…

【C++入门到精通】哈希 (STL) _ unordered_map _ unordered_set [ C++入门 ]

阅读导航 前言一、unordered系列容器二、unordered_map1. unordered_map简介⭕函数特点 2. unordered_map接口- 构造函数- unordered_map的容量- unordered_map的迭代器- unordered_map的元素访问- unordered_map的修改操作- unordered_map的桶操作 三、unordered_set1. unorde…

安全运营中心(SOC)综合指南

什么是安全运营中心&#xff08;SOC&#xff09; 安全运营中心&#xff0c;也称为信息安全运营中心 &#xff08;ISOC&#xff09;&#xff0c;是结构良好的网络安全战略的核心。安全运营中心是一个集中式枢纽&#xff0c;无论是在组织内部还是外包&#xff0c;都致力于对整个…

配电网重构知识及matlab实现

配网重构中&#xff0c;很重要的一个约束条件为配网应随时保持开环、辐射的状态&#xff1a; 配电网系统是属于闭环设计但是开环运行的系统&#xff0c;因此&#xff0c;在开关的开闭过程中&#xff0c;随时保持配电网的开环状态时很重要。Mendoza等利用图论&#xff0c;尤其是…

安全防御-第六次

内容安全 攻击可能只是一个点&#xff0c;防御需要全方面进行 DFI和DPI技术--- 深度检测技术 DPI --- 深度包检测技术--- 主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09;&#xff0c;之后对数据包的内容进行识别。&#xff08;应用层&…

【Web安全靶场】sqli-labs-master 1-20 BASIC-Injection

sqli-labs-master 1-20 BASIC-Injection 文章目录 sqli-labs-master 1-20 BASIC-Injection第一关-报错注入第二关-报错注入第三关-报错注入第四关-报错注入第五关-报错注入-双查询注入第六关-报错注入-双查询注入第七关-outfile写入webshell第八关-布尔盲注第九关-时间盲注第十…

LeetCode 刷题 [C++] 第240题.搜索二维矩阵 II

题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 题目分析 通过分析矩阵的特点发现&#xff0c;其左下角和右上角可以看作一个“二叉搜索树的根节…

Unity开发一个FPS游戏

在之前的文章Unity 3D Input System的使用-CSDN博客中,我介绍了如何用Input System来实现一个FPS游戏的移动控制,这里将进一步完善这个游戏。 以下是游戏的演示效果: fps_demo 添加武器模型 首先是增加主角玩家的武器,我们可以在网上搜索到很多免费的3D资源,例如在以下网…

物联网APP开发:技术、挑战与前景

随着科技的快速发展&#xff0c;物联网&#xff08;IoT&#xff09;已经成为当今世界的重要趋势。物联网是将物理世界的各种“事物”与互联网连接起来&#xff0c;通过智能设备、传感器和执行器实现数据的收集、交换和处理&#xff0c;以改善生活和工作的方式。物联网APP是实现…

贪心算法

贪心算法 例题1、股票买卖题目信息思路题解 2、货仓选址题目信息思路题解 3、糖果传递题目信息思路题解 4、雷达设备题目信息思路题解 例题 1、股票买卖 题目信息 思路 相邻两天&#xff0c;后>前&#xff0c;则交易一次 题解 #include <bits/stdc.h> #define en…

【从零开始学习重要知识点 | 第一篇】快速了解什么是幂等性以及常见解决方案

前言&#xff1a; 当我们在设计和实现分布式系统时&#xff0c;幂等性是一个非常重要的概念。幂等性可以简单地理解为&#xff1a;对于同一操作&#xff0c;不论执行多少次&#xff0c;产生的影响都是相同的。这个概念在分布式系统中非常重要&#xff0c;因为在这种环境下&…

如何使用ArcGIS Pro为栅格图添加坐标信息

在某些时候&#xff0c;我们从网上获取的资源是一张普通的栅格图&#xff0c;没有任何的坐标信息&#xff0c;如果想要和带坐标信息的数据一起使用就需要先添加坐标信息&#xff0c;在GIS上&#xff0c;我们把这个过程叫做地理配准&#xff0c;这里为大家介绍一下地理配准的方法…

【JavaEE】_前端POST请求借助form表单向后端传参

目录 1. 前端POST请求借助form表单向后端传参 2. 关于parameter方法获取参数的优先性问题 前端向后端传参通常有三种方法&#xff1a; 第一种&#xff1a;使用GET请求的query string部分向后端传参&#xff1a; 本专栏中已经详述了前端使用GET请求的query string向后端传参…

【严格递增】2972统计移除递增子数组的数目 II

作者推荐 动态规划的时间复杂度优化 本文涉及知识点 严格递增 子数组 LeetCode2972. 统计移除递增子数组的数目 II 给你一个下标从 0 开始的 正 整数数组 nums 。 如果 nums 的一个子数组满足&#xff1a;移除这个子数组后剩余元素 严格递增 &#xff0c;那么我们称这个子…

ESP32语音转文字齐护百度在线语音识别

一、导入(10分钟&#xff09; 学习目的 二、新授(70分钟) 1.预展示结果(5分钟) 2.本节课所用的软硬件(5分钟) 4.图形化块介绍(10分钟) 5.单个模块的简单使用(10分钟) 6.在线语音转换工具逻辑分析(10分钟) 7.在线语音转换工具分步实现(30分钟) 三、巩固练习(5分钟) 四、课堂小结…

【论文复现】——一种新的鲁棒三维点云平面拟合方法

目录 一、算法原理1、论文概述2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的GPT爬虫。 一、算法原理 1、论文概述 针对三维点云中的异常值和粗差点对平面拟合精度产生的影响,文章提出一…