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

news2025/2/26 23:00:32

前言

上篇文章讲了关于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中聚合操作相关的内容。

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

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

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

相关文章

Python实现自动检测设备连通性并发送告警到企业微信

背景&#xff1a;门禁机器使用的WiFi连接&#xff0c;因为某些原因会不定期自动断开连接&#xff0c;需要人工及时干预&#xff0c;以免影响门禁数据同步&#xff0c;故写此脚本&#xff0c;定时检测门禁网络联通性。 #首次使用要安装tcping模块 pip install tcpingfrom tcpin…

幻兽帕鲁服务器哪家便宜?阿里云腾讯云京东云华为云对比

幻兽帕鲁服务器哪家便宜&#xff1f;阿里云腾讯云京东云华为云对比&#xff0c;阿里云更便宜&#xff0c;26元1个月。游戏服务器租用多少钱一年&#xff1f;1个月游戏服务器费用多少&#xff1f;阿里云游戏服务器26元1个月、腾讯云游戏服务器32元&#xff0c;华为云26元&#x…

Android WebView访问网页+自动播放视频+自动全屏+切换横屏

一、引言 近期&#xff0c;我发现电视家、火星直播等在线看电视直播的软件都已倒闭&#xff0c;而我奶奶也再无法通过这些平台看电视了。她已六十多岁&#xff0c;快七十岁啦。这些平台的倒下对我来说其实没有多大的影响&#xff0c;但是对于文化不多的她而言&#xff0c;生活中…

常见需求:CSS 实现弧形卡片的 3 种方式

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~ 原文作者&#xff1a;前端侦探 在平时开发中&#xff0c;有时候会碰到下面这种“弧形”样式&#xff0c;主要分为“内凹”和“外凸”两种类型&#xff0c;如下 该如何实现呢&#xff1f;或者想一下&#xff0c;有哪…

用 Pyinstaller 模块将 Python 程序打包成 exe 文件(全网最全面最详细,万字详述)

目录 一、打包前置知识 1.1 什么是 exe 可执行文件&#xff1f; 1.2 为什么要将 Python 程序打包为 exe 可执行文件&#xff1f; 1.3 为什么 Python 程序不能直接运行呢&#xff1f; 1.4 我们用什么来打包 Python 文件呢&#xff1f; 1.5 打包有哪几种分类呢&#xff1f…

Spring-Cloud-Gateway集成Sentinel限流

1&#xff09;gateway添加sentinel相关依赖 <spring-cloud.version>2021.0.1</spring-cloud.version> <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version><dependencies><!--gateway--><dependency><gro…

多模态表征—CLIP及中文版Chinese-CLIP:理论讲解、代码微调与论文阅读

我之前一直在使用CLIP/Chinese-CLIP&#xff0c;但并未进行过系统的疏导。这次正好可以详细解释一下。相比于CLIP模型&#xff0c;Chinese-CLIP更适合我们的应用和微调&#xff0c;因为原始的CLIP模型只支持英文&#xff0c;对于我们的中文应用来说不够友好。Chinese-CLIP很好地…

为什么要智慧公厕?智慧公厕是做什么的

在现代城市信息化建设进程中&#xff0c;公共卫生设施的建设与管理一直备受关注。而随着科技的迅速发展&#xff0c;智慧公厕作为一种新型的信息化公共设施&#xff0c;正逐渐走进人们的视野。本文以智慧智慧源头厂家广州中期科技有限公司&#xff0c;大量精品案例现场实景&…

【重要公告】BSV区块链协会宣布将启动多项动态安全增强措施

​​发表时间&#xff1a;2024年2月16日 2024年2月16日&#xff0c;瑞士楚格 - BSV区块链协议的管理机构BSV区块链协会&#xff08;以下简称“BSV协会”&#xff09;宣布对其运营模式实施全新的安全架构&#xff0c;其中包括引入网络访问规则和数字资产找回协议&#xff0c;以及…

【非递归版】归并排序算法(2)

目录 MergeSortNonR归并排序 非递归&归并排序VS快速排序 整体思想 图解分析​ 代码实现 时间复杂度 归并排序在硬盘上的应用&#xff08;外排序&#xff09; MergeSortNonR归并排序 前面的快速排序的非递归实现&#xff0c;我们借助栈实现。这里我们能否也借助栈去…

浅谈Unity内存管理

浅谈Unity内存管理 前言 很早之前记录的Unity内存相关的知识点&#xff0c;在此补充到博客上来。有什么不对的地方欢迎指正探讨。 内存概念 虚拟内存&#xff08;Virtual Memory&#xff09; 众所周知&#xff0c;物理内存就是插在计算机主板内存槽上的实际物理内存。 虚拟…

SAP中分包后续调整应用实例二(调减)

之前己写过一篇介绍过分包后续调整功能MB04的基本应用。当时的场景是某个原材料由于各方面原因&#xff08;比如没有维护到BOM中&#xff09;&#xff0c;在委外加工模式成品收货后&#xff0c;并没有消耗或少消耗&#xff0c;这时可以用该事务功能来补充消耗。在生产报工中的M…

redis八股

文章目录 数据类型字符串实现使用场景 List 列表实现使用场景 Hash 哈希实现使用场景 Set 集合实现使用场景 ZSet 有序集合实现使用场景 BitMap实现使用场景 Stream使用场景pubsub为什么不能作为消息队列 数据结构机制SDS 简单动态字符串压缩列表哈希表整数集合跳表quicklistli…

CleanMyMac2024永久免费mac电脑版本安装包下载

CleanMyMac 4 for Mac&#xff1a;细致入微的功能介绍&#xff0c;CleanMyMac 4 for Mac作为一款系统清理和优化工具&#xff0c;提供了丰富而细致的功能&#xff0c;旨在满足Mac用户在不同场景下的清理和优化需求。以下是对CleanMyMac 4功能的更加细化介绍&#xff1a; CleanM…

苍穹外卖 -- day10- Spring Task- 订单状态定时处理- WebSocket- 来单提醒- 客户催单

苍穹外卖-day10 功能实现&#xff1a;订单状态定时处理、来单提醒和客户催单 订单状态定时处理&#xff1a; 来单提醒&#xff1a; 客户催单&#xff1a; 1. Spring Task 1.1 介绍 Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代…

CVE-2021–27065漏洞分析及复现

接着昨天的说 CVE-2021–27065 CVE-2021–27065是⼀个任意⽂件写⼊漏洞&#xff0c;它需要登陆的管理员账号权限才能触发。而CVE-2021–26855正好可以为我们提供了管理员账号权限。 登录管理员账号后,进入:服务器——>虚拟目录——>OAB 编辑OAB配置,在外部链接中写⼊s…

蜣螂优化算法DBO求解不闭合SD-MTSP,可以修改旅行商个数及起点(提供MATLAB代码)

一、蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09; 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为的启发所得…

【加密算法】AES对称加密算法简介

目录 前言 工作原理 SubBytes ShiftRows MixColumns AddRoundKey 应用场景 在Java中使用AES 加密和解密数据 注意事项和最佳实践 结论 前言 AES&#xff08;Advanced Encryption Standard&#xff09;是一种对称加密算法&#xff0c;它在密码学中被广泛应用。AES取代…

数学建模入门必看|关于2024第九届数维杯数学建模,你想知道的都在这里!

数维杯大学生数学建模挑战赛每年分为两场&#xff0c;每年上半年为数维杯国赛&#xff08;5月&#xff0c;俗称小国赛&#xff09;&#xff0c;下半年为数维杯国际赛(11月)&#xff0c;2023年第八届数维杯大学生数学建模挑战赛共有近1.4万名学生参赛&#xff0c;参赛队伍来自国…

【总第49篇】2.3深度学习开发任务实例(2)机器学习和深度学习的对比【大厂AI课学习笔记】

机器学习和深度学习都是用于图片分类任务的强大工具&#xff0c;但它们采用的方法和原理有所不同。下面我将分别解释这两种技术是如何应用于图片分类的&#xff0c;并着重讨论深度学习中的卷积概念。 机器学习在图片分类中的应用 传统的机器学习方法在进行图片分类时&#xf…