前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【详解】ElasticSearchQuery查询方式

【详解】ElasticSearchQuery查询方式

原创
作者头像
大盘鸡拌面
发布于 2024-12-29 13:28:03
发布于 2024-12-29 13:28:03
87900
代码可运行
举报
运行总次数:0
代码可运行

Elasticsearch Query查询方式

Elasticsearch(ES)是一个基于Lucene的高性能、分布式、开源搜索引擎,提供了多种灵活的查询方式以满足不同场景下的需求。在本文中,我们将深入探讨Elasticsearch的查询方式,并通过实例展示其用法。

1. Match Query(匹配查询)

Match Query是最常用的查询方式之一,它根据字段中的内容进行全文匹配查询。当你需要对某个字段进行全文检索时,可以使用match查询。

示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /products/_search
{
  "query": {
    "match": {
      "product_name": "laptop"
    }
  }
}

上述查询将在​​product_name​​字段中搜索包含“laptop”的文档。

2. Term Query(精确查询)

Term Query用于精确匹配字段中的值。它适用于keyword类型字段或已经进行过分词处理的字段。

示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /products/_search
{
  "query": {
    "term": {
      "category": "electronics"
    }
  }
}

这个查询将返回​​category​​字段值为“electronics”的文档。

3. Range Query(范围查询)

Range Query允许你根据字段的范围值进行查询,如数字或日期范围。你可以使用gt(大于)、gte(大于等于)、lt(小于)和lte(小于等于)等操作符来定义范围。

示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /products/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 100,
        "lte": 500
      }
    }
  }
}

上述查询将返回价格在100到500之间的产品文档。

4. Bool Query(布尔查询)

Bool Query通过组合多个查询条件来实现更复杂的查询逻辑。你可以使用must(必须匹配)、must_not(必须不匹配)和should(应该匹配)等子句来构建查询。

示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "product_name": "laptop" }},
        { "term": { "category": "electronics" }}
      ],
      "must_not": [
        { "range": { "price": { "gte": 2000 }}}
      ],
      "should": [
        { "match": { "description": "lightweight" }},
        { "match": { "tags": "portable" }}
      ]
    }
  }
}

这个查询将返回满足以下条件的产品文档:产品名称包含“laptop”,类别为“electronics”,价格小于2000,并且描述包含“lightweight”或标签包含“portable”。

5. 其他查询方式

除了上述查询方式外,Elasticsearch还提供了许多其他查询方式,如:

  • Match Phrase Query:用于匹配字段中连续的短语。
  • Prefix Query:根据字段的前缀进行查询。
  • Wildcard Query:使用通配符模式进行查询。
  • Fuzzy Query:根据字段中的模糊匹配进行查询。
  • Nested Query:用于查询嵌套在文档中的相关信息。
  • Aggregation Query:用于进行数据的统计和分析,如求和、平均值、最小值、最大值和分组等。

结论

Elasticsearch提供了丰富多样的查询方式,可以满足各种复杂场景下的搜索需求。通过灵活组合这些查询方式,你可以构建出高效且精确的搜索解决方案。希望本文能帮助你更好地理解和应用Elasticsearch的查询功能。当然,我可以为您提供一个简单的示例代码,结合实际应用场景。假设我们正在开发一个电子商务网站,并希望实现一个功能,让用户能够添加商品到购物车中。以下是一个简单的Python示例代码,用于演示这个过程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Product:
    def __init__(self, id, name, price):
        self.id = id
        self.name = name
        self.price = price

class Cart:
    def __init__(self):
        self.items = {}

    def add_product(self, product, quantity):
        if product.id not in self.items:
            self.items[product.id] = {'product': product, 'quantity': 0}
        self.items[product.id]['quantity'] += quantity

    def get_total_price(self):
        total = 0
        for item in self.items.values():
            total += item['product'].price * item['quantity']
        return total

    def display_cart(self):
        for item_id, item_details in self.items.items():
            product = item_details['product']
            quantity = item_details['quantity']
            print(f"{product.name} (ID: {product.id}) - Quantity: {quantity} - Price: {product.price * quantity}")
        print(f"Total Price: {self.get_total_price()}")

# 创建产品实例
product1 = Product(1, 'Laptop', 1000)
product2 = Product(2, 'Smartphone', 500)

# 创建购物车实例
cart = Cart()

# 添加产品到购物车
cart.add_product(product1, 2)  # 添加2台笔记本电脑到购物车
cart.add_product(product2, 1)  # 添加1部智能手机到购物车

# 显示购物车内容和总价
cart.display_cart()

这个示例代码定义了两个类:​​Product​​​和​​Cart​​​。​​Product​​​类表示一个产品,包含产品的ID、名称和价格。​​Cart​​​类表示购物车,它有一个字典属性​​items​​​来存储购物车中的产品及其数量。​​Cart​​​类还提供了​​add_product​​​方法来添加产品到购物车,并指定数量;​​get_total_price​​​方法来计算购物车中所有产品的总价;以及​​display_cart​​方法来显示购物车的内容和总价。

在示例的末尾,我们创建了两个产品实例(笔记本电脑和智能手机),然后创建了一个购物车实例,并将这些产品添加到购物车中。最后,我们调用​​display_cart​​方法来显示购物车的内容和总价。当然可以,但您没有提供具体的代码段,所以我将假设您想要了解一个典型的中等复杂度的代码示例,并对其进行详细解释。以下是一个简单的Python代码,用于从用户输入中读取一系列数字,并计算它们的总和与平均值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def calculate_sum_and_average():
    numbers = input("请输入一系列数字,用空格隔开:").split()
    num_list = [float(num) for num in numbers]  # 将字符串列表转换为浮点数列表
    total_sum = sum(num_list)  # 计算总和
    average = total_sum / len(num_list)  # 计算平均值
    return total_sum, average

if __name__ == "__main__":
    total, avg = calculate_sum_and_average()
    print(f"数字的总和是:{total}")
    print(f"数字的平均值是:{avg}")

现在,我将详细解释这段代码:

  1. 函数定义
  • ​def calculate_sum_and_average():​​​ 定义了一个名为 ​​calculate_sum_and_average​​ 的函数,该函数不接受任何外部参数。
  1. 获取用户输入
  • ​numbers = input("请输入一系列数字,用空格隔开:").split()​​​:这行代码首先打印一个提示消息,要求用户输入一系列用空格隔开的数字。​​input()​​​ 函数读取用户的输入(作为字符串),然后使用 ​​split()​​ 方法将其拆分为一个字符串列表,其中每个字符串代表一个数字。
  1. 数据转换
  • ​num_list = [float(num) for num in numbers]​​​:这里使用了一个列表推导式(list comprehension),它遍历 ​​numbers​​​ 列表中的每个字符串元素,并将其转换为浮点数。转换后的浮点数存储在新的列表 ​​num_list​​ 中。
  1. 计算总和
  • ​total_sum = sum(num_list)​​​:​​sum()​​​ 函数是Python的内置函数,用于计算列表中所有元素的总和。这里,它计算 ​​num_list​​​ 中所有浮点数的总和,并将结果存储在变量 ​​total_sum​​ 中。
  1. 计算平均值
  • ​average = total_sum / len(num_list)​​​:要计算平均值,我们将总和 ​​total_sum​​​ 除以列表 ​​num_list​​​ 的长度(即元素的数量)。​​len()​​​ 函数返回列表中的元素数量。计算出的平均值存储在变量 ​​average​​ 中。
  1. 返回结果
  • ​return total_sum, average​​​:函数结束时返回两个值:总和 ​​total_sum​​​ 和平均值 ​​average​​。
  1. 主程序入口
  • ​if __name__ == "__main__":​​:这是Python脚本的标准主程序入口。当脚本被直接执行(而不是作为模块导入)时,这个条件成立。
  • 在这个条件下,我们调用 ​​calculate_sum_and_average()​​​ 函数,并将返回的总和和平均值分别赋值给变量 ​​total​​​ 和 ​​avg​​。
  • 然后,我们使用 ​​print()​​ 函数打印出总和和平均值的消息。

这段代码展示了如何从用户那里获取输入、处理数据(包括类型转换和数学运算),并输出结果。它是编程中常见任务的一个简单示例。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
2万字|30张图带你领略glibc内存管理精髓
看了下面所有的回答,要么是没有回答到点上,要么是回答不够深入,所以,借助本文,深入讲解C/C++内存管理。
高性能架构探索
2022/08/25
1.9K1
2万字|30张图带你领略glibc内存管理精髓
记一次内存占用问题的调查过程
最近在维护一台CentOS服务器的时候,发现内存无端"损失"了许多,free和ps统计的结果相差十几个G,搞的我一度又以为遇到灵异事件了,后来Google了许久才搞明白,特此记录一下,以供日后查询。
早起的鸟儿有虫吃
2020/06/07
4.1K0
技术分享 | MySQL: 压测结果很差怎么办
爱可生 DBA 团队成员,擅长故障分析、性能优化,个人博客:https://www.jianshu.com/u/a95ec11f67a8,欢迎讨论。
爱可生开源社区
2021/12/20
8330
技术分享 | MySQL: 压测结果很差怎么办
神秘!申请内存时底层发生了什么?
内存的申请释放对程序员来说就像空气一样自然,你几乎不怎么能意识到,有时你意识不到的东西却无比重要,申请过这么多内存,你知道申请内存时底层都发生什么了吗?
小林coding
2021/02/23
7360
神秘!申请内存时底层发生了什么?
万字长文,别再说你不懂Linux内存管理了,30 张图给你安排的明明白白
之前写了两篇详细分析 Linux 内存管理的文章,读者好评如潮。但由于是分开两篇来写,而这两篇内容其实是有很强关联的,有读者反馈没有看到另一篇读起来不够不连贯,为方便阅读这次特意把两篇整合在一起,看这一篇就够了!
程序员小猿
2021/01/19
2.7K0
万字长文,别再说你不懂Linux内存管理了,30 张图给你安排的明明白白
【操作系统】内存管理概述
常见的内存分配函数有malloc,mmap等,但大家有没有想过,这些函数在内核中是怎么实现的?换句话说,Linux内核的内存管理是怎么实现的?
嵌入式与Linux那些事
2024/05/11
2180
【操作系统】内存管理概述
一文读懂 Linux 内存分配全过程
在《你真的理解内存分配》一文中,我们介绍了 malloc 申请内存的原理,但其在内核怎么实现的呢?所以,本文主要分析在 Linux 内核中对堆内存分配的实现过程。
用户7686797
2021/05/11
1.7K0
一文读懂 Linux 内存分配全过程
一文浅析内存管理机制
众所周知,程序需要加载到物理内存才能运行,多核时代会出现多个进程同时操作同一物理地址的情况,进而造成混乱和程序崩溃。计算机当中很多问题的解决都是通过引入中间层,为解决物理内存使用问题,虚拟内存作为中间层进入了操作系统,从此,程序不在直接操作物理内存,只能看到虚拟内存,通过虚拟内存,非常优雅的将进程环境隔离开来,每个进程都拥有自己独立的虚拟地址空间,且所有进程地址空间范围完全一致,也给编程带来了很大的便利,同时也提高了物理内存的使用率,可同时运行更多的进程。
范蠡
2021/04/08
1.4K0
一文浅析内存管理机制
77%的Linux运维都不懂的内核问题
来源:高效运维 ID:greatops 前言 之前在实习时,听了 OOM 的分享之后,就对 Linux 内核内存管理充满兴趣,但是这块知识非常庞大,没有一定积累,不敢写下,担心误人子弟,所以经过一个一段时间的积累,对内核内存有一定了解之后,今天才写下这篇博客,记录以及分享。 【OOM - Out of Memory】内存溢出 内存溢出的解决办法: 1、等比例缩小图片 2、对图片采用软引用,及时进行 recycle( ) 操作。 3、使用加载图片框架处理图片,如专业处理图片的 ImageLoader 图片加
小小科
2018/06/20
2.1K0
频繁分配释放内存导致的性能问题的分析
1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70 2 用ps -o majflt,minflt -C program命令查看(pidstat也可以),
早起的鸟儿有虫吃
2019/05/05
7.2K0
频繁分配释放内存导致的性能问题的分析
【春节红包系列】一次"内存泄漏"引发的血案
2017年末,手Q春节红包项目期间,为保障活动期间服务正常稳定,我对性能不佳的Ark Server进行了改造和重写。重编发布一段时间后,结果发现新发布的Svr的机器内存一直在上涨。如下图示:
叫你不戴帽子
2018/05/29
7.1K4
【春节红包系列】一次"内存泄漏"引发的血案
为什么MySQL内存占用这么大? for InnoDB
这是 Innodb 引擎最重要的缓存,也是提升查询性能的重要手段。一般是global共享内存中占用最大的部分。在进行 SQL 读和写的操作时,首先并不是对物理数据文件操作,而是先对 buffer_pool 进行操作,然后再通过 checkpoint 等机制写回数据文件。占用的内存启动后就不会自动释放,默认通过LRU的算法镜像缓存淘汰,每次的新数据页,都会插入buffer pool的中间,防止前面的热数据被冲掉,长时间没动静的冷数据,会被淘汰出buffer pool,但是是被其它新数据占用了,所以一般这里不会释放的,除非重启(5.7 开始支持动态调整,默认以128M的chunk单位分配内存块)。innodb_buffer_pool主要包含数据页、索引页、undo 页、insert buffer、自适应哈希索引、锁信息以及数据字典等信息。
elontian田凌翔
2019/11/11
7.9K0
为什么MySQL内存占用这么大? for InnoDB
软件性能测试(连载9)
Linux内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。Linux的空间又分为内核空间和用户空间,在32位中,内核空间占1G,用户空间占3G;而在64位中,内核空间和用户空间各占128T。如图3-24所示。
顾翔
2020/02/20
9840
linux 内存管理初探
导语 linux 内存是后台开发人员,需要深入了解的计算机资源。合理的使用内存,有助于提升机器的性能和稳定性。本文主要介绍 linux 内存组织结构和页面布局,内存碎片产生原因和优化算法,linux
郑剑
2017/08/11
10.1K2
linux 内存管理初探
进程内存管理初探
随着cpu技术发展,现在大部分移动设备、PC、服务器都已经使用上64bit的CPU,但是关于Linux内核的虚拟内存管理,还停留在历史的用户态与内核态虚拟内存3:1的观念中,导致在解决一些内存问题时存在误解。
刘盼
2020/06/19
2.5K0
进程内存管理初探
内存问题探微
因为这是我被问的最频繁的问题,哎呀我的程序 OOM 了怎么办,我的程序内存超过配额被 k8s 杀掉了怎么办,我的程序看起来内存占用很高正常吗?
范蠡
2020/12/15
9500
内存问题探微
Linux 了解内存使用
目前大部分的操作系统和应用程序并不需要16EB( 2^64 )如此巨大的地址空间, 实现64位长的地址只会增加系统的复杂度和地址转换的成本, 带不来任何好处. 所以目前的x86-64架构CPU都遵循AMD的Canonical form, 即只有虚拟地址的最低48位才会在地址转换时被使用, 且任何虚拟地址的48位至63位必须与47位一致(sign extension). 也就是说, 总的虚拟地址空间为256TB( 2^48 )
黄规速
2022/04/14
3.8K0
Linux 了解内存使用
十问 Linux 虚拟内存管理 ( 一 )
该文章介绍了如何通过 pmap 命令查看进程的虚拟地址空间使用情况,包括起始地址、大小、实际使用内存、脏页大小、权限、偏移、设备和映射文件等。通过分析这些信息,可以更好地了解程序运行时的内存使用情况,并找出潜在的内存泄漏、内存碎片等问题。
陈福荣
2016/11/02
11.5K0
十问 Linux 虚拟内存管理 ( 一 )
【Linux 内核 内存管理】内存管理架构 ② ( 用户空间内存管理 | malloc | ptmalloc | 内核空间内存管理 | sys_brk | sys_mmap | sys_munmap)
glibc 提供的 ptmalloc 函数 , FreeBSD 提供的 jemalloc 函数 , Google 提供的 tcmalloc 函数 ,
韩曙亮
2023/03/30
1.1K0
当Linux用尽内存
也许你很少面临这一情况,但是一旦如此,你一定知道出什么错了:可用内存不足或者说内存用尽(OOM)。结果非常典型:你不能再分配内存,内核会杀掉一个任务(一般是正在运行那个)。一般半随着大量的交换读写,你可以从屏幕和磁盘动向看出来。
一见
2018/08/10
5.1K0
推荐阅读
相关推荐
2万字|30张图带你领略glibc内存管理精髓
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档