【Elasticsearch】简单搜索(三)

news2024/11/24 3:08:45

简介:Elasticsearch(ES)是一个开源的分布式搜索和分析引擎,用于快速存储、搜索和分析大量数据。它具有高性能、可扩展性和灵活性的特点,被广泛用于构建实时搜索、日志分析、数据可视化等应用。

这篇文章主要介绍检索相关的操作,单值、多值、范围、模糊等查询方式,使用bool支持多种条件复杂查询。

一、环境准备

版本

Docker version 20.10.22
elasticsearch:7.13.3
kibana:7.13.3
ps:具体启动命令参考第一篇ES博客

二、数据准备

下载官网测试数据

在ES官网中提供了简单的查询数据。点击下载示例数据 官方测试数据(bank)

使用postman导入到ES中

请求类型:POST
请求地址:http://127.0.0.1:9200/bank/account/_bulk?pretty
请求参数:binary类型,选择导入的json
image.png

Bank索引中的字段类型

执行命令GET bank/_mapping查看bank索引的字段类型为 “text”,在ES中 “text” 类型用于存储长文本数据,并进行全文索引。

address字段为例,其类型为 “text”,其中也存在子字段为 “keyword” 的字段,类型为 “keyword”。“keyword” 类型用于存储关键字或短文本数据,通常用于精确匹配和排序操作。
通过定义子字段,可以在同一个字段上同时使用不同类型的分析器和查询方式。对于 “address” 字段,你可以使用 “text” 类型进行全文搜索,同时也可以使用 “keyword” 类型进行精确匹配和排序。
ps:使用方式为 address.keyword

在这个示例中, “keyword” 子字段还定义了 “ignore_above” 属性,它指定了该子字段中的值超过256个字符时将被截断。这可以用来限制关键字的长度,以便控制索引大小和提高检索性能。

{
  "bank" : {
    "mappings" : {
      "properties" : {
        "account_number" : {
          "type" : "long"
        },
        "address" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
        // 省略其他字段
      }
    }
  }
}

四、标准查询

匹配单个字段

通过以下命令查询索引 bank 中,地址含有 place 字样的数据,返回了 181 条。
此字段为 text,查询时会进行分词匹配,像 282 Kings Place会被ES进行分词,查询条件中含有分词后的单词,所以会被查出来。适合全文检索时使用。

其中 _score 返回值为匹配程度的一个得分,一定程度上讲,分值越大匹配越近似。

GET /bank/_search
{
  "query": {
    "match": {
      "address": "place"
    }
  }
}

GET /bank/_search
{
  "query": {
    "term": {
      "address": "place"
    }
  }
}

// 查询结果
  "hits" : [
      {
        "_index" : "bank",
        "_type" : "account",
        "_id" : "20",
        "_score" : 1.7070332,
        "_source" : {
          "account_number" : 20,
          "balance" : 16418,
          "firstname" : "Elinor",
          "lastname" : "Ratliff",
          "age" : 36,
          "gender" : "M",
          "address" : "282 Kings Place",
          "employer" : "Scentric",
          "email" : "elinorratliff@scentric.com",
          "city" : "Ribera",
          "state" : "WA"
        }
      },

精准匹配单个字段

上述查询在 address 后加上 keyword 的限制,那么这个字段就是 keyword 类型,只能进行精确查询,不再通过分词检索。age本身为数值型字段,不存在分词操作,查询全都是精确匹配。

GET /bank/_search
{
  "query": {
    "term": {
      "address.keyword": "282 Kings Place"
    }
  }
}

GET /bank/_search
{
  "query": {
    "term": {
      "age": "32"
    }
  }
}

多值匹配单个字段

使用 terms 命令,可以对字段进行多种关键词搜索,效果如同关系型数据库的 in 查询。

GET /bank/_search
{
  "query": {
    "terms": {
      "age": [
        "32",
        "33",
        "34"
      ]
    }
  }
}

范围查询

使用 range 关键词。参数含义如下

  • gt - 大于 ( > )
  • gte - 大于且等于 ( >= )
  • lt - 小于 ( < )
  • lte - 小于且等于 ( <= )
GET /bank/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 32,
        "lte": 33
      }
    }
  }
}

模糊查询

模糊查询有多重方式,这里介绍两种,一种是模糊,一种是正则

GET /bank/_search
{
  "query": {
    "wildcard": {
      "firstname": {
        "value": "am*"
      }
    }
  }
}

四 、Bool组合查询

在ES中bool查询就是用来组合布尔查询条件,布尔查询条件,就是类似SQL中的and 、or 。
下面是一个复合查询语句,分别使用了mustfiltermust_notshould。下面的语句相当于SQL

SELECT
	* 
FROM
	bank 
WHERE
	gender = "M" 
	AND state = "IA" 
	AND city != "Healy" 
	OR ( age = 39 OR age = 21)
POST bank/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "gender.keyword": "M"
          }
        }
      ],
      "filter": [
        {
          "match": {
            "state.keyword": "IA"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "city.keyword": "Healy"
          }
        }
      ],
      "should": [
        {
          "match": {
            "age": "39"
          }
        },
        {
          "match": {
            "age": "21"
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 10,
  "sort": [
    {
      "firstname.keyword": {
        "order": "desc"
      }
    }
  ],
  "aggs": {}
}

查询关键词 Query Action

  1. 布尔查询:must,must_not,should等。类似SQL的and,or,! 等
  2. 匹配查询:match multi_match等。类似SQL的like
  3. 范围查询:range。类似SQL的大于,小于,等于
  4. term查询:term。类似SQL的 “=”
  5. 正则查询:regex 正则
  6. exists和missing查询:类似于SQL is null,is not null

查询语法总结

  • 最外层为query
  • 单重条件查询只需在 query 写入条件,复合查询条件包含在bool对象中

分页查询

from、size 分别对应 page 和 pageSize

排序

排序的写法就如一个对象,对象的 key 为字段名,value为排序规则,当然是可以多字段一起排序的,写入多个即可

查询关键词与分数关系

mustmust查询是必要条件,必须满足。参与相关性评分
filter与must类似,同样必须满足。不参与相关性评分,但结果集会被缓存
should如果只有一个 should 子句情况下与 must 子句结果一样,如果有多个should子句情况下,命中任何一个即可
must_not与must类似,同样必须不满足。不参与相关性评分,但结果集会被缓存

五、总结

  • 在ES中,如同普通SQL语句都有着类似API可以调用。
  • ES支持对内容进行分词,根据分词进行搜索,并对结果进行打分。适合对文章内容进行搜索,而关系型数据库例如 MySQL,对这个功能支持能力不强。
  • 查询语句在query内层套用 bool,可以支持多种条件过滤,同时也可以计算得分。

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

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

相关文章

HTML详细基础(一)H5标签入门

本帖为B站网课黑马程序员的学习笔记&#xff0c;总结了H5最核心的概念性质&#xff0c;适用于初学者或者应对期末考试的群体~ 目录 一.Html简介 二.开发工具 三.基础标签 1.核心基础 2.标题标签 3.段落标签 ​编辑 4.文本格式标签 5.盒子标签 6.图片标签 一.Html简介 H…

液氮超低温保存法的原理

细菌保存是有效保存活体微生物群体&#xff0c;使细菌不死、不衰、不变&#xff0c;便于研究和应用。保存细菌的方法有很多。保存原理是利用干燥、低温、隔离空气的方法&#xff0c;降低微生物菌株的代谢速度&#xff0c;使菌株的生命活动处于半永久性休眠状态&#xff0c;从而…

小程序编译器性能优化之路

作者 | 马可 导读 小程序编译器是百度开发者工具中的编译构建模块&#xff0c;用来将小程序代码转换成运行时代码。旧版编译器由于业务发展&#xff0c;存在编译慢、内存占用高的问题&#xff0c;我们对编译器做了一次大规模的重构&#xff0c;采用自研架构&#xff0c;做了多线…

【Elasticsearch】基础概念(一)

简介&#xff1a;Elasticsearch&#xff08;ES&#xff09;是一个开源的分布式搜索和分析引擎&#xff0c;用于快速存储、搜索和分析大量数据。它具有高性能、可扩展性和灵活性的特点&#xff0c;被广泛用于构建实时搜索、日志分析、数据可视化等应用。 本人主要介绍Elasticsea…

【自监督Re-ID】ICCV_2023_Oral | ISR论文阅读

Codehttps://github.com/dcp15/ISR_%20ICCV2023_Oral 面向泛化行人再识别的身份导向自监督表征学习&#xff0c;清华大学 目录 导读 摘要 相关工作 DG ReID 用于ReID的合成数据 无监督表征学习 Identity-Seeking Representation Learning 结果 消融实验 导读 新角度…

WPF Frame content binding page(Using MVVM)

前言 这个binding问题困扰了我几天时间了&#xff0c;弄了好的demo试了又试。之前老是认为是ItemsControl中数据模版DataTemplate中绑定Command问题&#xff0c;根据测试没问题。一直在考虑是否是绑定DataContext对象没指明同一个上下文对象问题。最后在MainWindow.xaml文件中F…

Nginx location 精准匹配URL = /xxx

Location是什么&#xff1f; Location是Nginx中的块级指令(block directive)&#xff0c;通过配置Location指令块&#xff0c;可以决定客户端发过来的请求URI如何处理&#xff08;是映射到本地文件还是转发出去&#xff09;及被哪个location处理。 匹配模式 分为两种模式&…

ETL增量抽取模式实践与调优

在ETL&#xff08;Extract, Transform, Load&#xff09;流程中&#xff0c;增量抽取是一种重要的数据提取方式&#xff0c;允许从源系统中仅提取发生变化的数据&#xff0c;以提高处理效率和减少资源消耗。增量抽取模式有多种实现方式&#xff0c;包括时间戳增量、增量标记和增…

Bug:Mac版Goland无法进行debug

Bug&#xff1a;Mac版Goland无法进行debug 报错&#xff1a; API server listening at: 127.0.0.1:58574 debugserver-(#)PROGRAM:LLDB PROJECT:lldb-1400.0.38.17 for x86_64 (running under translation). error: failed to launch process /Library/Developer/CommandLineT…

电缆隧道在线监测系统:提升电力设施安全与效率的关键

随着城市化进程的加快&#xff0c;电力电缆隧道在保障城市电力供应方面的地位日益重要。然而&#xff0c;电缆隧道环境复杂&#xff0c;容易受到多种因素影响&#xff0c;如温度、湿度、烟雾、水位等&#xff0c;严重威胁电力设施的安全与稳定运行。在此背景下&#xff0c;电缆…

华为OD机考算法题:最小数量线段覆盖

目录 题目部分 解读与分析 代码实现 题目部分 题目最小数量线段覆盖难度难题目说明给定坐标轴&#xff08;一维坐标轴&#xff09;上的一组线段&#xff0c;线段的起点和终点均为整数并且长度不小于1&#xff0c;请你从中找到最少数量的线段&#xff0c;这些线段可以覆盖住…

基于微信小程序的社区垃圾回收管理系统设计与实现

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

Eclipse安装sts插件(eclipse 内置应用市场无法搜索到sts时)

下面提供一个可以通过help->install new software->add添加外部sts&#xff08;spring tool suite&#xff09;插件&#xff0c;springplugins - https://download.springsource.com/release/TOOLS/update/e4.12/ 官网(https://spring.io/tools3/sts/all)可以下载不同的…

Nodejs基于Vue.js博物馆预约系统7e122

博物馆展览与服务一体化&#xff0c;其工作流程繁杂、多样、管理复杂与设备维护繁琐。而计算机已完全能够胜任博物馆展览与服务一体化工作&#xff0c;而且更加准确、方便、快捷、高效、清晰、透明&#xff0c;它完全可以克服以上所述的不足之处。这将给查询信息和管理带来很大…

Spring Boot 中的 CSRF 保护配置

Spring Boot 中的 CSRF 保护配置 CSRF&#xff08;Cross-Site Request Forgery&#xff09;是一种网络攻击&#xff0c;它利用已认证用户的身份来执行未经用户同意的操作。Spring Boot 提供了内置的 CSRF 保护机制&#xff0c;可以帮助您防止这种类型的攻击。本文将介绍如何在…

ArduPilot开源飞控之GCS显示DPS310异常问题

ArduPilot开源飞控之GCS显示DPS310异常问题 1. 源由2. 现象3. 分析3.1 Mission Planner3.2 Ardupilot3.3 AP_Baro分析3.4 AP_Baro定位 4. 修复5. 效果6. 参考资料7. 补充7.1 Ardupilot提交PR注意事项7.2 修复主要使用到的命令 1. 源由 2020年Ardupilot官网论坛就有开始讨论DPS…

CompletableFuture-链式语法和join方法介绍

2.4 案例精讲-从电商网站的比价需求展开 2.4.1 函数式编程已成为主流 Lambda表达式Stream流式调用Chain链式调用Java8函数式编程 函数式接口&#xff1a; 小结&#xff1a; 函数式接口&#xff1a; Java8新特性_四大内置核心函数式接口_java8 内置核心接口_ZHOU_VIP的博客-…

idea没有maven工具栏解决方法

背景&#xff1a;接手的一些旧项目&#xff0c;有pom文件&#xff0c;但是用idea打开的时候&#xff0c;没有认为是maven文件&#xff0c;所以没有maven工具栏&#xff0c;不能进行重新加载pom文件中的依赖。 解决方法&#xff1a;选中pom.xml文件&#xff0c;右键 选择添加为…

华为乾坤区县教育安全云服务解决方案(1)

华为乾坤区县教育安全云服务解决方案&#xff08;1&#xff09; 课程地址方案背景客户痛点分析区县教育网概述区县教育网业务概述区县教育网业务安全风险分析区县教育网安全运维现状分析区县教育网安全建设痛点分析 安全解决方案功能概述架构概述方案架构设备选型 课程地址 本…

mysql的锁分类:表锁和行锁和页面锁

一 锁的概念 1.1 锁的作用 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;如CPU、RAM、I/O等&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有…