掌握ElasticSearch(五):查询和过滤器

news2024/10/24 6:23:35

一、查询和过滤器的区别

在 Elasticsearch 中,查询(Query)和过滤器(Filter)是用于检索和筛选数据的重要组成部分。它们虽然都能用来查找文档,但在性能和用法上有所不同。下面详细介绍查询和过滤器的概念以及它们之间的区别。

查询 (Query)

查询不仅用于查找匹配的文档,还可以计算相关性得分(_score),以确定文档与查询的匹配程度。查询通常用于全文搜索、短语匹配等场景,其中文档的相关性非常重要。

过滤器 (Filter)

过滤器用于精确筛选文档,不计算相关性得分。因此,过滤器比查询更快,因为它们不需要计算分数。过滤器通常用于过滤特定条件的文档,如日期范围、特定值等。

性能差异

  • 查询:计算相关性得分,性能相对较低。
  • 过滤器:不计算相关性得分,性能较高,适合用于频繁使用的条件。

使用场景

  • 查询:当需要根据相关性排序结果时,例如全文搜索、推荐系统等。
  • 过滤器:当需要精确筛选文档时,例如日期范围、类别过滤等。

组合使用

在实际应用中,查询和过滤器经常一起使用,以达到最佳效果。例如,可以使用 bool 查询来组合查询和过滤器:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "Elasticsearch"
          }
        }
      ],
      "filter": [
        {
          "range": {
            "publish_date": {
              "gte": "2023-01-01",
              "lte": "2023-12-31"
            }
          }
        }
      ]
    }
  }
}

在这个例子中:

  • must 子句中的 match 查询用于全文搜索标题中包含 “Elasticsearch” 的文档。
  • filter 子句中的 range 过滤器用于筛选 publish_date 在 2023 年内的文档。

二、ElasticSearch的查询类型

Elasticsearch 提供了多种查询类型,每种类型都有其特定的用途和适用场景。下面是一些常见的查询类型及其简要说明:

在这里插入图片描述

1. 全文查询 (Full Text Queries)

这些查询类型用于全文搜索,可以处理复杂的自然语言查询。

  • Match Query: 最常用的全文查询,可以处理分析器对文本的分析。

    {
      "match": {
        "field": "text"
      }
    }
    
  • Multi Match Query: 类似于 match 查询,但可以在多个字段上进行搜索。

    {
      "multi_match": {
        "query": "text",
        "fields": ["field1", "field2"]
      }
    }
    
  • Match Phrase Query: 用于匹配完整的短语,而不是单独的词项。

    {
      "match_phrase": {
        "field": "text"
      }
    }
    
  • Match Phrase Prefix Query: 类似于 match_phrase,但允许前缀匹配。

    {
      "match_phrase_prefix": {
        "field": "text"
      }
    }
    
  • Common Terms Query: 用于查找常见词和不常见词,可以控制如何处理低频词和高频词。

    {
      "common": {
        "field": {
          "query": "text",
          "cutoff_frequency": 0.001
        }
      }
    }
    

2. 术语级别查询 (Term Level Queries)

这些查询类型用于精确匹配,不涉及分析器。

  • Term Query: 用于精确匹配单个词项。

    {
      "term": {
        "field": "value"
      }
    }
    
  • Terms Query: 用于匹配多个词项。

    {
      "terms": {
        "field": ["value1", "value2"]
      }
    }
    
  • Range Query: 用于匹配某个范围内的值。

    {
      "range": {
        "field": {
          "gte": 10,
          "lte": 20
        }
      }
    }
    
  • Exists Query: 用于检查某个字段是否存在。

    {
      "exists": {
        "field": "field"
      }
    }
    
  • Prefix Query: 用于前缀匹配。

    {
      "prefix": {
        "field": "pre"
      }
    }
    
  • Wildcard Query: 用于通配符匹配。

    {
      "wildcard": {
        "field": "te*t"
      }
    }
    
  • Regexp Query: 用于正则表达式匹配。

    {
      "regexp": {
        "field": "te.*t"
      }
    }
    

3. 布尔查询 (Compound Queries)

这些查询类型用于组合多个查询条件。

  • Bool Query: 用于组合多个查询条件,支持 must, should, must_not, filter 子句。

    {
      "bool": {
        "must": [
          { "match": { "field1": "text" } }
        ],
        "should": [
          { "match": { "field2": "text" } }
        ],
        "must_not": [
          { "match": { "field3": "text" } }
        ],
        "filter": [
          { "range": { "field4": { "gte": 10 } } }
        ]
      }
    }
    
  • Dis Max Query: 用于在多个字段上进行查询,并选择最相关的文档。

    {
      "dis_max": {
        "queries": [
          { "match": { "field1": "text" } },
          { "match": { "field2": "text" } }
        ]
      }
    }
    
  • Constant Score Query: 用于将查询转换为固定得分。

    {
      "constant_score": {
        "filter": {
          "term": { "field": "value" }
        }
      }
    }
    

4. 特殊查询 (Specialized Queries)

这些查询类型用于特定的高级功能。

  • Function Score Query: 用于自定义文档的得分。

    {
      "function_score": {
        "query": { "match_all": {} },
        "functions": [
          {
            "gauss": {
              "field": {
                "origin": "2023-01-01",
                "scale": "10d"
              }
            }
          }
        ]
      }
    }
    
  • Script Score Query: 用于使用脚本计算文档的得分。

    {
      "script_score": {
        "query": { "match_all": {} },
        "script": {
          "source": "doc['field'].value * 2"
        }
      }
    }
    
  • More Like This Query: 用于查找与给定文档相似的文档。

    {
      "more_like_this": {
        "fields": ["field1", "field2"],
        "like": "text",
        "min_term_freq": 1,
        "min_doc_freq": 1
      }
    }
    

5. 地理查询 (Geo Queries)

这些查询类型用于地理空间数据的搜索。

  • Geo Distance Query: 用于查找距离指定点一定范围内的文档。

    {
      "geo_distance": {
        "distance": "200km",
        "location": {
          "lat": 40.715,
          "lon": -74.006
        }
      }
    }
    
  • Geo Bounding Box Query: 用于查找位于指定矩形区域内的文档。

    {
      "geo_bounding_box": {
        "location": {
          "top_left": {
            "lat": 40.73,
            "lon": -74.00
          },
          "bottom_right": {
            "lat": 40.71,
            "lon": -73.99
          }
        }
      }
    }
    
  • Geo Polygon Query: 用于查找位于指定多边形区域内的文档。

    {
      "geo_polygon": {
        "location": {
          "points": [
            { "lat": 40.73, "lon": -74.00 },
            { "lat": 40.73, "lon": -73.99 },
            { "lat": 40.71, "lon": -73.99 },
            { "lat": 40.71, "lon": -74.00 }
          ]
        }
      }
    }
    

6. 其他查询

  • Match All Query: 返回所有文档,常用于获取索引中的所有数据。

    {
      "match_all": {}
    }
    
  • Match None Query: 不返回任何文档,常用于测试或调试。

    {
      "match_none": {}
    }
    

三、ElasticSearch的过滤器类型

在 Elasticsearch 中,过滤器(Filter)用于精确筛选文档,不计算相关性得分,因此性能较高。下面是一些常见的过滤器类型及其简要说明:

在这里插入图片描述

1. 术语级别过滤器 (Term Level Filters)

这些过滤器用于精确匹配,不涉及分析器。

  • Term Filter: 用于精确匹配单个词项。

    {
      "term": {
        "field": "value"
      }
    }
    
  • Terms Filter: 用于匹配多个词项。

    {
      "terms": {
        "field": ["value1", "value2"]
      }
    }
    
  • Range Filter: 用于匹配某个范围内的值。

    {
      "range": {
        "field": {
          "gte": 10,
          "lte": 20
        }
      }
    }
    
  • Exists Filter: 用于检查某个字段是否存在。

    {
      "exists": {
        "field": "field"
      }
    }
    
  • Prefix Filter: 用于前缀匹配。

    {
      "prefix": {
        "field": "pre"
      }
    }
    
  • Wildcard Filter: 用于通配符匹配。

    {
      "wildcard": {
        "field": "te*t"
      }
    }
    
  • Regexp Filter: 用于正则表达式匹配。

    {
      "regexp": {
        "field": "te.*t"
      }
    }
    

2. 布尔过滤器 (Boolean Filters)

这些过滤器用于组合多个过滤条件。

  • Bool Filter: 用于组合多个过滤条件,支持 must, should, must_not, filter 子句。
    {
      "bool": {
        "must": [
          { "term": { "field1": "value1" } }
        ],
        "should": [
          { "term": { "field2": "value2" } }
        ],
        "must_not": [
          { "term": { "field3": "value3" } }
        ],
        "filter": [
          { "range": { "field4": { "gte": 10 } } }
        ]
      }
    }
    

3. 特殊过滤器 (Specialized Filters)

这些过滤器用于特定的高级功能。

  • Script Filter: 用于使用脚本进行复杂的条件判断。

    {
      "script": {
        "script": {
          "source": "doc['field'].value > 10"
        }
      }
    }
    
  • Ids Filter: 用于匹配特定的文档 ID。

    {
      "ids": {
        "values": ["1", "2", "3"]
      }
    }
    

4. 地理过滤器 (Geo Filters)

这些过滤器用于地理空间数据的筛选。

  • Geo Distance Filter: 用于查找距离指定点一定范围内的文档。

    {
      "geo_distance": {
        "distance": "200km",
        "location": {
          "lat": 40.715,
          "lon": -74.006
        }
      }
    }
    
  • Geo Bounding Box Filter: 用于查找位于指定矩形区域内的文档。

    {
      "geo_bounding_box": {
        "location": {
          "top_left": {
            "lat": 40.73,
            "lon": -74.00
          },
          "bottom_right": {
            "lat": 40.71,
            "lon": -73.99
          }
        }
      }
    }
    
  • Geo Polygon Filter: 用于查找位于指定多边形区域内的文档。

    {
      "geo_polygon": {
        "location": {
          "points": [
            { "lat": 40.73, "lon": -74.00 },
            { "lat": 40.73, "lon": -73.99 },
            { "lat": 40.71, "lon": -73.99 },
            { "lat": 40.71, "lon": -74.00 }
          ]
        }
      }
    }
    

5. 其他过滤器

  • Match All Filter: 返回所有文档,常用于获取索引中的所有数据。

    {
      "match_all": {}
    }
    
  • Match None Filter: 不返回任何文档,常用于测试或调试。

    {
      "match_none": {}
    }
    

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

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

相关文章

Lucas带你手撕机器学习——K近邻

K近邻 (K-Nearest Neighbor KNN) K近邻算法(K-Nearest Neighbors, KNN)是一种简单直观的机器学习算法,适用于分类和回归问题。它的核心思想是:判断一个数据点的类别或预测值时,参考它在特征空间中最近的 KKK 个数据点…

【2024】【字节青训营】:字节青训营入营测试题——Java版本(已提交通过)

目录 简单题目 计算x到y的最小步数 环状 DNA 序列的最小表示法 Base32 解码和编码 打点计时器 兔群繁殖之谜 完美整数 找出整数数组中占比超过 一半 的数 找出最长的神奇数列 找单独的数 字符串最短循环字串 二进制反码转换问题 中等题目 简单四则运算 数字翻译…

什么是微服务中的反应性扩展?

大家好,我是锋哥。今天分享关于【什么是微服务中的反应性扩展?】面试题?希望对大家有帮助; 什么是微服务中的反应性扩展? Reactive Extensions 也称为 Rx。这是一种设计方法,我们通过调用多个服务来收集结果…

STM32G474使用TIM2触发DAC输出输出正弦波

STM32G474使用TIM2触发DAC输出,数据从内存到外设就要使用DMA来协助。DAC1每隔1秒输出一个正弦波数据,就会模拟近似得到模拟的正弦波形。用来测试CPU内部的运算放大器,或者用作其它模拟输入信号。 测试程序如下: #include "…

立志最细,FreeRtos的中断管理(Interrupt Management)函数,详解!!!

前言:本文参考,韦东山老师开发文档,连接放在最后。 为什么需要中断管理函数? 在FreeRtos操作系统中,需要实时响应性,也就是随时随地必须保证正常多任务的运行,如果有中断发生,因为中…

Spring Cloud --- Sentinel 规则持久化

为什么要持久化 一旦我们重启微服务应用,sentinel 规则将消失,生产环境需要将配置规则进行持久化 怎么实现持久化 将限流配置规则持久化进 Nacos 保存,只要刷新 8401 某个 rest 地址,sentinel 控制台的流控规则就能看到&#x…

keil新建工程HC32L176MATA

先看一下最后的文件夹结构(文件夹结构可以根据项目实际的需要去定义) keil内: 参考文章: KEIL平台下新建华大HC32F460单片机工程笔记_hc32f keil环境搭建-CSDN博客 (我根据需要,创建的文件夹结构和原文是有…

面试总结一

面试总结 1、自我介绍一下自己2.面试11、css常用布局有哪些2、css常用的属性3.js原型链4、开发中遇到的技术难点5、闭包6、ts了解什么呢7.git都用什么命令8、vue怎么打包9.vue启动一个项目需要什么10、vue怎么创建一个项目 2.面试21.vue2和vue3有什么区别2.复杂组件的封装&…

C#,自动驾驶技术,ASAM OpenDRIVE BS 1.8.0 规范摘要与C# .NET Parser

本文介绍自动驾驶技术的标准之一《ASAM OpenDRIVE》1.8.0 版本的规范摘要,及北京联高软件开发有限公司实现的 C# 版本 xodr 文件(XML) Parser 源代码。 本文档是 ASAM e.V. 的版权财产。 在更改常规许可条款时,ASAM 允许不受限制地…

gateway 整合 spring security oauth2

微服务分布式认证授权方案 在分布式授权系统中,授权服务要独立成一个模块做统一授权,无论客户端是浏览器,app或者第三方,都会在授权服务中获取权限,并通过网关访问资源 OAuth2的四种授权模式 授权码模式 授权服务器将授…

【原创】统信UOS如何安装最新版Node.js(20.x)

注意直接使用sudo apt install nodejs命令安装十有八九会预装10.x的老旧版本Node.js,如果已经安装的建议删除后安装如下方法重装。 在统信UOS系统中更新Node.js可以通过以下步骤进行: 1. 卸载当前版本的Node.js 首先,如果系统中已经安装了N…

Maven进阶——坐标、依赖、仓库

目录 1.pomxml文件 2. 坐标 2.1 坐标的概念 2.2 坐标的意义 2.3 坐标的含义 2.4 自己项目的坐标 2.5 第三方项目坐标 3. 依赖 3.1 依赖的意义 3.2 依赖的使用 3.3 第三方依赖的查找方法 3.4 依赖范围 3.5 依赖传递和可选依赖 3.5.1 依赖传递 3.5.2 依赖范围对传…

推荐一个开源非线性视频编辑器:Kdenlive

Kdenlive是一个开源的视频编辑软件,项目始于约2003年。它基于Qt和KDE框架库构建,大部分视频处理由MLT框架完成,同时依赖其他开源项目如FFmpeg、frei0r、movit、ladspa、sox等。 软件特点: - 多轨视频编辑:支持多个音频…

大数据新视界 -- 大数据大厂之大数据和增强现实(AR)结合:创造沉浸式数据体验

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

2024 睿抗机器人开发者大赛(RAICOM)-【网络安全】CTF 部分WP

文章目录 一、前言二、MICS你是黑客么循环的压缩包Goodtime 三、WEBpy 四、Crypto变异凯撒RSAcrypto3 一、前言 WP不完整,仅供参考! 除WEB,RE,PWN外,其余附件均已打包完毕 也是一个对MISC比较友好的一个比赛~ 123网…

springboot066人事系统(论文+源码)_kaic

基于vue的人事系统 摘要 随着信息技术在管理上越来越深入而广泛的应用,作为学校以及一些培训机构,都在用信息化战术来部署线上学习以及线上考试,可以与线下的考试有机的结合在一起,实现基于vue的人事系统在技术上已成熟。本文介绍…

u盘装win10系统提示“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”解决方法

我们在u盘安装原版win10 iso镜像时,发现在选择硬盘时提示了“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”,直接导致了无法继续安装下去。出现这种情况要怎么解决呢?下面小编分享u盘安装win10系统提示“windows无法安装到这个磁盘…

信息安全工程师(53)网络安全审计机制与实现技术

前言 网络安全审计机制是指为了保护网络安全并发现潜在风险和漏洞而进行的一系列审计活动。审计的目的是检查并评估网络系统的安全性,以确保其符合相关法律法规和安全标准。 一、网络安全审计机制的重要性 网络安全审计机制对于保护组织的信息资产和敏感数据至关重要…

简单的 curl HTTP的POSTGET请求以及ip port连通性测试

简单的 curl HTTP的POST&GET请求以及ip port连通性测试 1. 需求 我们公司有一个演示项目,需要到客户那边进行项目部署,项目部署完成后我们需要进行项目后端接口的测试功能,但是由于客户那边么有条件安装类似于postman这种的测试工具&am…

CSS3文本阴影、文本换行、文本溢出、文本修饰、文本描边的使用

1.文本阴影:text-shadow 2.文本换行: white-space:pre(可以理解为按原文显示) white-space:pre-wrap(不会超出父容器) 3.文本溢出 text-overflow:ellipsis一般配合文本…