ElasticSearch常用查询操作

news2024/11/14 13:28:50

ES查询

     一般我们使用ES最多的就是查询,今天就讲一下ES的查询。这里我是建了一个person的索引。

"person" : {
    "aliases" : { },
    "mappings" : {
      "properties" : {
        "address" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "age" : {
          "type" : "long"
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }

基本查询操作

1.查询所有数据并进行排序

GET person/_search
{
  "query":{
    "match_all": {}
  },
  "sort":{
    "age":"desc"
  }
}

说明:这里是一个GET请求,person代表索引,_search表示搜索(固定写法)。

"query"表示查询。“match_all”表示查询所有。后面的sort就表示要对查询结果进行排序。age 表示要排序的字段。而desc表示降序排序。asc升序排序。

 结果说明:took表示查询花费时间(ms),_shards分片信息。搜索了多少个分片。hits查询结果,tatoal.value搜索到了几个文档。

2.分页查询

主要就是用到一个from(第几页),size(每页大小)。

GET person/_search
{
  "query":{
    "match_all": {}
  },
  "sort":{
    "age":"desc"
  },
  "from":1,
  "size":1
}

3.查询段落匹配

比如我们想查某个字段里面包好了某个字符串的话,就可以使用这种查询。比如我想查地址里面包含疾风的数据。

GET person/_search
{
  "query":{
    "match_phrase": {
      "address": "疾风"
    }
  }
}

 

复合查询 

1.多条件bool查询

通过布尔将较小的查询组合成大的查询。

如果存在多个查询条件就需要用到这种查询。比如我要查年龄为23岁,并且地址不在海南的人。这里查询注意格式,方括号大括号不能少,这是我觉得比较难受的一个点。

GET person/_search
{
  "query":{
    "bool":{
      "must":[
        {"match":{"age":"23"}}
        ],
      "must_not": [
        {"match": {
          "address": "海南"
        }}
      ]
    }
  }
}

bool表示这是一个布尔查询,must和must_not表示必须满足和不满足,而里面的就是条件,必须匹配条件为年龄23,且地址不为海南的人。

特点:

  • 子查询可以任意顺序出现。

  • 可以嵌套多个查询,包括布尔查询

除了上面的must和must_not,还有should(选择性匹配至少满足一条),filter过滤,必须匹配。

全文搜索

1.Match类型

使用match全文搜索

GET person/_search
{
  "query": {
    "match": {
      "name": "冯"
    }
  }
}

这个查询首先回去判断name是text类型,text类型是会被分词的,那么查询字符串本身也会被分词。然后查询字符串会被传入标准分析器中,因为自由一个字所以这个查询的底层是单个的term查询。term查询会计算每个文档的相关度评分_score,如果是多个汉字是怎样?

GET person/_search
{
  "query": {
    "match": {
      "name": "老板"
    }
  }
}

 结果:

这里我并没有安装新的分词器,默认是一个汉字分成一个词。他可以等同如下查询:

 

他等同于should的两个term查询,只要满足任意一个就可以。其实match还有一个operator参数,默认是or,所以should也能查询出来,如果改成and就是需要同时满足.

 等同于:

2.quert string类型

首先看例子

GET person/_search
{
  "query": {
    "query_string": {
      "default_field": "address",  
      "query": " 疾风 OR 达州"
    }
  }
}

 

        

GET person/_search
{
  "query": {
    "query_string": {
      "default_field": "address",
      "query": "疾风 AND 归途"
    }
  }
}

 

上面两个查询仔细看很容易理解,query_string查询就是 根据运算符(and 或者 or)来解析和拆分字符串。然后查询在返回匹配的文档前独立分析每个拆分的文本。

除了这些查询外还有许多其他查询方式,这里这是讲了一种,以后再使用其他的时候可以对照理解。

term查询

1.基于单词的查询,基于id查询。

GET person/_search
{
  "query": {
    "ids":{
      "values":[1,2,3]
    }
  }
}

2.通过前缀查询

GET person/_search
{
  "query": {
    "prefix": {
      "name": {
        "value": "冯"
      }
    }
  }
}

3.分词匹配查询

GET person/_search
{
  "query": {
    "term": {
      "name": {
        "value": "老"
      }
    }
  }
}

 

多个分词匹配

这里我之前在项目代码里面遇到过,查询对接人通过职位编码来进行匹配,利用了这种查询。还是比较多用的

GET person/_search
{
  "query": {
    "terms": {
      "name": [
        "冯",
        "陈"
      ]
    }
  }
}

 

4.通配符:wildcard

GET person/_search
{
  "query": {
    "wildcard": {
      "name": {
        "value": "冯*"
      }
    }
  }
}

 范围查询

GET person/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 20,
        "lte": 30
      }
    }
  }
}

5.正则:regexp

get person/_search
{
  "query":{
    "regexp": {
      "name": "冯*"
    }
  }
}

6.模糊匹配:fuzzy

get person/_search
{
  "query":{
    "fuzzy": {
      "address": {
        "value": "疾"
      }
    }
  }
}

聚合查询

聚合查询就是类似我们在SQL中的group by。聚合查询中有两个概念,一个是桶:满足特定条件的文档的集合。还有一个是指标:就是对桶内的文档进行统计计算。所以在ES里面有三种聚合方式:

1.桶聚合

2.指标聚合

3.管道聚合

首先准备一批数据:

POST /test-agg-cars/_bulk
{ "index": {}}
{ "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" }
{ "index": {}}
{ "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" }
{ "index": {}}
{ "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" }
{ "index": {}}
{ "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }

1.标准聚合

比如说我们想得到每个颜色的销量

GET test-agg-cars/_search
{
  "size":0,    							//siz指定为0,hits不会返回搜索结果
  "aggs": {     						//聚合查询
    "pop_colors": {         //为聚合查询的结果指定一个想要的名称
      "terms": { 						//定义桶的类型为terms(桶:满足特定条件的文档集合)
        "field": "color.keyword"   //每个桶的key都与color字段里找到的唯一词对应
      }
    }
  }
}

查询结果:

doc_count告诉我们每个包含该词项的文档数量。

2.多个聚合

计算两种桶的结果

GET /test-agg-cars/_search
{
  "size": 0,
  "aggs":{
    "pop_colors":{
      "terms": {
        "field": "color.keyword"
      }
    },
    "make_by":{
      "terms": {
        "field": "make.keyword"
      }
    }
  }
}

 查询结果

3.聚合嵌套

比如我们要查询每种颜色的平均价格,首先使用聚合查询每种颜色,然后再嵌套一个聚合查询每种颜色的平均价格。

GET test-agg-cars/_search
{
  "size": 0,
  "aggs": {
    "colors": {
      "terms": {
        "field": "color.keyword"
      },
    "aggs":{
      "avg_price":{
        "avg": {
          "field": "price"
        }
      }
    }
  }
}
}

查询结果:

 4.前置过滤条件:filter

比如我们只想查某一个类型的平均价格,可以先使用filter过滤出来,然后再使用一个嵌套聚合计算平均价格。

GET test-agg-cars/_search
{
  "size": 0,
  "aggs":{
    "make_by":{
      "filter": {
        "term": {
          "make": "honda"
        }
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

查询结果:

 5.对number类型聚合:range

查询某一个范围。

{
  "size":0,
  "aggs": {
    "price_ranges": {
      "range": {
        "field": "price",
        "ranges": [
          {
            "from": 10000,
            "to": 15000
          }
        ]
      }
    }
  }
}

结果:

 6.对日期类型聚合

我觉得这种聚合查询应用的场景会比较多。查询某个时间范围内的数据。

GET test-agg-cars/_search
{
  "size":0,
  "aggs": {
    "range": {
      "date_range": {
        "field": "sold",
        "ranges": [
          {
            "from": "2014-10-28",
            "to": "2014-11-05"
          }
        ]
      }
    }
  }
}

结果:

 

聚合查询之metric聚合

metric聚合从分类上来看,可以分为单值分析和多值分析。

  • 单值分析就是只输出一个分析结果,标准的stat型。

1.avg 平均值

2.max 最大值

3.min 最小值

4.sum 和

5.value_count 数量

其他类型 cardinality记述(distinct去重),weighted_avg 带权重的avg。。。

  • 多值分析

    省略,因为我觉得不是很常用,到时候会查文档就行。

单值分析

avg平均值:计算平均值

GET person/_search
{
  "size": 0, 
  "aggs":{
    "avg_age":{
      "avg": {
        "field": "age"
      }
    }
  }
}
//返回结果
 "aggregations" : {
    "avg_age" : {
      "value" : 30.857142857142858
    }
  }

max最大值:

GET person/_search
{
  "size":0,
  "aggs": {
    "max_age": {
      "max": {
        "field": "age"
      }
    }
  }
}
//返回结果
 "aggregations" : {
    "max_age" : {
      "value" : 40.0
 }

min最小值:与最大值类似

sum求和:

GET person/_search
{
  "size":0,
  "aggs": {
    "sum_age": {
      "sum": {
        "field": "age"
      }
    }
  }
}
//返回结果
  "aggregations" : {
    "sum_age" : {
      "value" : 216.0
    }
  }

Value_count数量

GET person/_search?size=0
{
  "aggs": {
    "name_count": {
      "value_count": {
        "field": "age"
      }
    }
  }
}
//返回结果
  "aggregations" : {
    "sum_age" : {
      "value" : 216.0
    }
  }

 目前就简单介绍了这些查询,其实在es官网可以看到很多不同的查询,包括管道啥之类的,但是我们以后使用的时候要知道大致的查询分为哪几类,然后每种查询得能在官网快速定位,然后通过例子学会使用并理解。

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

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

相关文章

[LeetCode周赛复盘] 第 102 场双周赛20230415

[LeetCode周赛复盘] 第 102 场双周赛20230415 一、本周周赛总结二、 6333. 查询网格图中每一列的宽度1. 题目描述2. 思路分析3. 代码实现三、6334. 一个数组所有前缀的分数1. 题目描述2. 思路分析3. 代码实现四、6335. 二叉树的堂兄弟节点 II1. 题目描述2. 思路分析3. 代码实现…

English Learning - L2 第 15 次小组纠音 助动词弱读和重音节奏 2023.4.15 周六

English Learning - L2 第 15 次小组纠音 助动词弱读和重音节奏 2023.4.15 周六共性问题have has /hv/ /hz/ 弱读成 /həv/ /həz/fine left /faɪn/ /left/late changed train /leɪt/ /ʧeɪnʤd/ /treɪn/ 中的 eɪmoment problem time /ˈməʊmənt/ /ˈprɒbləm/ /taɪm…

4.10~4.11学习总结

ER图的学习: 学习了ER图相关知识,并绘制了项目大概的ER图 详细笔记博客:http://t.csdn.cn/YOJxq MySQL的学习: 函数 学习了字符串函数,数值函数,日期函数,流程函数。 约束 作用于表中字段的规则…

改善Instagram客户服务的6个技巧

Instagram仍然是全球前四大社交网络,按用户数量排名。它通过其创新的过滤器、内容创建工具、视频和卷轴选项继续增长并推动流量。这是一个平台,世界顶级名人和有影响力的人可以为全球用户提供有趣和令人印象深刻的内容。 但不仅仅是一个娱乐平台&#xf…

Nestjs实战干货-概况-异常过滤器-Exception filters

异常过滤器 Nest 带有一个内置的异常层,负责处理应用程序中所有未处理的异常。当应用程序代码未处理异常时,该层会捕获该异常,然后自动发送适当的用户友好响应。 开箱即用,此操作由内置的全局异常过滤器执行,该过滤器…

三、Locust任务(task)详解

当一个负载测试开始时,将为每个模拟用户创建一个用户类的实例,他们将在自己的绿色线程中开始运行。当这些用户运行时,他们会选择执行的任务,睡眠一段时间,然后选择一个新的任务,如此循环。 这些任务是正常…

二、Java 并发编程(4)

本章概要 Java 中的锁 乐观锁悲观锁自旋锁synchronizedReentrantLocksynchronized 与 ReentrantLock 对比SemaphoreAtomicInteger可重入锁公平锁和非公平锁读写锁共享锁和独占锁重量级锁和轻量级锁偏向锁分段锁同步锁和死锁如何进行锁优化 2.6 Java 中的锁 Java 中的锁主要…

【C语言进阶:动态内存管理】C/C++中程序内存区域的划分

⚡C/C中程序内存区域的划分 C/C程序内存分配的几个区域: 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结 束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指…

day8 互斥锁/读写锁的概念及使用、死锁的避免

目录 互斥锁的概念和使用 线程通信 - 互斥 互斥锁的创建和销毁 互斥锁的创建 互斥锁的销毁 互斥锁的使用 申请锁 释放锁 互斥锁的概念和使用 线程通信 - 互斥 临界资源: 一次只允许一个任务(进程、线程)访问的共享资源&#xff1b…

Maven-依赖管理

一. 依赖管理 1. maven-依赖管理-依赖配置 依赖:指当前项目运行所需要的jar包。一个项目中可以引入多个依赖: 例如:在当前工程中,我们需要用到logback来记录日志,此时就可以在maven工程的pom.xml文件中&#xff0c…

Python让ChatGPT全自动改写生成文章教程

ChatGPT是一个在自然语言处理领域非常先进的文本生成模型,它能够产生高质量、连贯的文章。它受到了广泛的关注,因为它可以自动生成大量的文本,从而减轻了人工写作的负担。怎么使用chatgpt批量改写文章?最简单的方式就是找到一家接…

I.MX6U开发板使用OTG烧写系统

1.系统烧写 在实际的产品开发中肯定不可能通过网络来运行,否则没网的时候产品岂不 是就歇菜了。因此我们需要将 uboot、linux kernel、.dtb(设备树)和 rootfs 这四个文件烧写到板子 上的 EMMC、NAND 或 QSPI Flash 等其他存储设备上,这样不管有没有网络我…

SpringCloud 使用sentinel

一、添加依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> 二、配置文件配置地址 spring:cloud:sentinel:transport:dashboard: localhost:8080三…

机器学习:基于逻辑回归对优惠券使用情况预测分析

机器学习&#xff1a;基于逻辑回归对优惠券使用情况预测分析 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x…

Elasticsearch:集群管理的一些建议

在之前的文章 “Elasticsearch&#xff1a;集群管理” &#xff0c;我们对集群管理做了一些介绍。在今天的文章中&#xff0c;我们接着来聊一下有关配置的方面的问题。这在很大程度上取决于你的用例&#xff0c;是索引还是搜索繁重。 我们将在这里讨论在集群设置方面我们需要关…

中国算力的想象力有多大?|产业特稿

巨头入场和“东数西算”的助推&#xff0c;让中国离这个万亿级算力蓝海更近了一步。 作者|思杭 编辑|皮爷 出品|产业家 2023年初&#xff0c;在青岛、济南、日照等12座城市&#xff0c;一座座崭新的大型数据中心拔地而起。 其中&#xff0c;最引人瞩目的属2月23日&#xff…

文件上传漏洞 --- php邂逅windows通用上传缺陷

目录 后端源码 前端源码 后端代码审计 方式一绕过原理 --- 冒号加特性 验证及结果 方式二绕过原理 --- 数据流 验证及结果 环境需求 php5.2.17IIS环境&#xff0c;可以下载phpstuday2018来满足环境的要求。 后端源码 <?php //U-Mail demo ... if(isset($_POST[sub…

【AI能否取代设计师】「Stable Diffusion」AI绘画黑科技将告诉你答案

上一篇文章&#xff1a;【AI绘画】我以Midjourney为主学习AI绘画效果咋样&#xff1f;_山楂山楂丸的博客-CSDN博客 目录 前言 一、「Stable Diffusion」 是什么 二、「Stable Diffusion」上手演练 三、竟然还有ChatGPT&#xff1f; 四、「Stable Diffusion」作品展示 五、…

爆火的Auto-GPT:实战及运行体验

Auto-GPT可以说是目前AI应用方向最火爆的项目了&#xff0c;自从3月份上线以来&#xff0c;一个月疯狂拦下将近7万star&#xff08;截至本文写稿时69.5k&#xff09;。它的目的是探索诸如GPT-4这样的大语言模型自主完成任务的能力。业界也有一些大佬出来表示这个项目真的很有趣…

pnpm与monorepo架构

本文根据b站up小满zs教程记录 软硬连接介绍 在cmd环境下输入mklink 创建链接需要开启管理员模式 软连接 # mklink 要创建的连接名称 源文件 mklink ruan.js ying.js硬链接 共享一个内存地址。 # mklink 要创建的连接名称 源文件 mklink /H ying.js ying.jspn…