ElasticSearch - 基本操作

news2024/9/25 23:25:43

前言

本文记录 ES 的一些基本操作,就是对官方文档的一些整理,按自己的习惯重新排版,凑合着看。官方的更详细,建议看官方的。

下文以 books 为索引名举例。

新增

添加单个文档 (没有索引会自动创建)

POST books/_doc
{"name": "Snow Crash", "author": "Neal Stephenson", "release_date": "1992-06-01", "age": 18}

不指定 id,会随机生成,如果需要指定 id,使用 POST books/_doc/id

还可以使用 put 的方式新增,例入 POST books/_doc/id,这种方式必须带 id,否则会报错

以上两种方式,如果带上了 id,就是不存在就插入,存在旧更新

更新

总结 (有三种方式):

  • POST 更新
    • 如果 URL 带 _update,更新前会对比新旧数据,如果新旧数据完全相同,将不会进行任何操作 noop,不会影响序列号、版本号信息。
    • 如果 URI 不带 _update,不会检查原数据,都会显示 updated
  • PUT 更新
    • 路径没法带 _update,每次都会更新显示 updated

例如有原数据

{
	"name": "zhangsan",
	"age": 18
}

POST 访问:(路径带_update)

需要在参数外套一层 doc,这种方式不影响其他字段

POST /books/_update/1
{
    "doc": {
        "name": "lisi"
    }
}

// 执行之后原数据变成
{
	"name": "lisi",
	"age": 18
}

POST 访问:(路径不带_update)

和带 id 新增的语法是一样的,不存在就是插入,存在就是更新。这种方式会清空其他字段

POST /books/_doc/1
{
    "name": "lisi"
}

// 执行之后原数据变成
{
	"name": "lisi"
}

PUT 访问:(路径不能带_update)

效果同第 2 点

PUT /books/_doc/1
{
    "name": "lisi"
}

删除

DELETE /books/_doc/1

POST /books/_delete_by_query
{查询条件...}

搜索

官方实例数据:account. json

使用 [Bulk API](Bulk API | Elasticsearch Guide [8.12] | Elastic) 来批量插入,没有安装 kibana 也可以用 postman 导入

如果插入记录搜索不到,可能是索引未来得及刷新,可以手动触发

POST /article/_refresh

根据 id 获取文档

// 获取带元数据的
GET /bank/_doc/1
// 获取不带元数据的
GET /bank/_source/1
// 判断文档是否存在
HEAD /bank/_doc/1

使用 HEAD 只会返回 {} 空对象,可以根据请求是否 404 判断文档是否存在

_search 命令搜索

注意:如果你用 es-client 连接的 es,请将 GET 换成 POST,否则查询无效

原因是 GET 请求没有带上 body 参数

默认只会返回最先匹配到的 10 条文档

GET /bank/_search

返回结果:

took:检索花费时间,单位毫秒(从节点收到查询到将数据返回客户端之前)

timed_out: 布尔类型,检索是否超时

hits: 命中的记录

total.value: 总记录的数量

hits.total: 所有命中的记录

搜索全部

GET /bank/_search
{
    "query": {
        "match_all": {}
    }
}

排序

Sort search results | Elasticsearch Guide [8.12] | Elastic

GET /bank/_search
{
    "sort": [
        {
            "account_number": "desc"
        },
        {
            "balance": { // 两种写法都行
                "order": "asc"
            }
        }
    ]
}

sort :排序条件,先对 account_number 降序,如果 account_number 相同,再对 balance 升序

其他排序参数

GET /bank/_search
{
    "sort": [
        {
            "arr": {
                "order": "desc", // 排序
                "mode": "min", // 排序模式
                "missing": "_last" // 缺失值处理
            }
        }
    ]
}

排序模式

用于对数组或多值字段排序。比如有数据如下

{
    "age": 25,
    "arr": [
        11000,
        23234
    ]
}

arr 字段就是多值字段。

升序排序的默认排序模式是 min 。默认的降序排序模式是 max

mode说明
min选择最低值
max选择最高值
sum总和作为排序值
avg平均值作为排序值
median中位数作为排序值

缺失值处理

顾名思义,就是排序时,没有该字段的文档排前面还是排后面。

missing 值可以设置为 _last 、 _first,默认为 _last

分页

Paginate search results | Elasticsearch Guide [8.12] | Elastic

查询方式数据量实时查询排序跳页适用场景
form+size 浅分页支持支持支持实时查询,跳页查询
scroll 标准方式不支持支持不支持深度分页,有序的批量查询
scroll_scan 滚动扫描不支持不支持不支持深度分页,无需的批量查询
search_after 分页支持支持不支持深度分页,数据批量导出

from + size

默认返回前 10 个结果。可以使用 from 和 size 参数,from 定义要跳过的命中数,默认 0,size 是返回的最大命中数。类比 mysql 中的 limit 0,10

默认情况下,无法使用 from 和 size 来翻阅超过 10,000 个匹配项。也就是前 10000 条数据可以用这种方式分页。如果数据太多,请使用search_after

GET /bank/_search
{
    "from": 0,
    "size": 10
}

search_after

注意:搜索必须指定排序字段,否则获取不到 search_after 需要的参数。

使用步骤:
一、第一页不需要使用 search_after

// 查询
GET /bank/_search
{
    "sort": [ // 必须指定排序字段
        "account_number",
        "age"
    ]
}

// 响应
{
    ...
    "hits": {
        ...
        "hits": [
            {
                ...
                "sort": [ 0, 29]
            }
        ]
    }
}

第二页的搜索,就带上前一页的 hits.sort 中的参数

GET /bank/_search
{
	"search_after": [0, 29],
    "sort": [ // 必须指定排序字段
        "account_number",
        "age"
    ]
}

TODO PIT

A 查询数据,B 同时在插入数据,为了解决 A 两次查询的数据不一致,可以使用 point int time

检索选定的字段

Retrieve selected fields from a search | Elasticsearch Guide [8.12] | Elastic

关键词 fields,可以指定返回字段和格式

搜索 API

Query DSL | Elasticsearch Guide [8.12] | Elastic

Search API | Elasticsearch Guide [8.12] | Elastic

query 和 filter

query 就是普通的查询,会计算分数。

filter 不会计算分数,es 还会自动缓存常用的过滤器提高性能

说明:Query and filter context | Elasticsearch Guide [8.12] | Elastic

用法:Boolean query | Elasticsearch Guide [8.12] | Elastic

复合查询

Compound queries | Elasticsearch Guide [8.12] | Elastic

全文查询

intervals 文本灵活查询

Intervals query | Elasticsearch Guide [8.12] | Elastic

允许用户精确控制查询词在文档中出现的先后关系,实现了对 terms 顺序、terms 之间的距离以及它们之间的包含关系的灵活控制

match 模糊查询

Match query | Elasticsearch Guide [8.12] | Elastic

对基本类型,是精确匹配(比如 long、日期等)。对字符串是模糊查询,对查询的值分词,对分词的结果一一进入倒排索引去匹配

GET /ft/_search
{
    "query": {
        "match" : {
            "my_text":{
                "query": "my when",
                "operator": "or"
            }
        }
    }
}

解释:查找 my_text 字段中包含 my 或者 when 的文档。

query: 需要查询的内容

operator:默认是 or,如果改成 and,就需要 my_text 中同时包含 when 和 my

analyzer:分词器,默认使用字段的分词器

prefix 前缀查询

GET /ft/_search
{
    "query": {
        "prefix": {
            "my_text": {
                "value": "favo"
            }
        }
    }
}

匹配 my_text 中以 favo 开头的,注意是不能分词的,也就是 my fa 查不到 cold my favourite food,但是用 favo 可以找到

match_bool_prefix 分词前缀查询

prefix 不能分词,那么 match_bool_prefix 就来了

GET /ft/_search
{
    "query": {
        "match_bool_prefix": {
            "my_text": {
                "query": "quick brown f"
            }
        }
    }
}

解释:先分词,最后一个词按前缀处理,前面的词语直接匹配,只要有一个命中就可以

匹配 quick brown foxtwo quick brown ferretsthe fox is quick and brown

match_phrase 短语匹配查询

顾名思义,match 会分词,match_phrase 不会分词

GET /ft/_search
{
    "query": {
        "match_phrase": {
            "my_text": {
                "query": "wo shi"
            }
        }
    }
}

match_phrase_prefix 短语前缀匹配查询

GET /ft/_search
{
  "query": {
    "match_phrase_prefix": {
      "my_text": {
        "query": "quick brown f"
      }
    }
  }
}

与 match_bool_prefix 的区别就是不分词,匹配 quick brown foxtwo quick brown ferrets,不匹配 the fox is quick and brown

combined_fields 组合多字段查询

Combined fields | Elasticsearch Guide [8.12] | Elastic

这个有点不太理解。

GET /ft/_search
{
    "query": {
        "combined_fields": {
            "query": "ren shui",
            "fields": [
                "title",
                "my_text"
            ],
            "operator": "and"
        }
    }
}

解释:效果类似于将 title 和 my_text 两个字段合并成一个,再执行查询

注意,我把 operator 改成 and 了,但是只要 title 和 my_text 组合起来,包含了 ren 和 shui 就能命中

multi_match 多字段查询

Multi-match query | Elasticsearch Guide [8.12] | Elastic

在 match 查询的基础上,允许多字段查询

GET /ft/_search
{
    "query": {
        "multi_match": {
            "query": "ren shui",
            "fields": [
                "title",
                "my_text"
            ],
            "operator": "and"
        }
    }
}

解释:我把 operator 改成了 and,那么需要 title 同时包含 ren 和 shui 两个词,或者 my_text 同时包含两个词,才能命中。和 combined_fields 有区别的。

总结

没啥好总结的,吐槽一句,官方文档对新手不太友好。新手需要的是快速使用,怎么调 api

参考

【ElasticSearch(四)】PUT&POST更新数据、DELETE删除数据、_bulk批量操作 - musecho - 博客园 (cnblogs.com)

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

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

相关文章

Web and HTTP

Web and HTTP First, a review… ▪ web page consists of objects ▪ object can be HTML file, JPEG image, Java applet, audio file,… ▪ web page consists of base HTML-file which includes several referenced objects ▪ each object is addressable by a URL, e.g.,…

在Linux环境底下 用C语言执行Python程序

在Linux环境底下 用C语言执行Python程序 文章目录 在Linux环境底下 用C语言执行Python程序1、环境安装&检测2、C语言调用Python语句2.1 直接调用python语句2.2 调用无参python函数2.3 调用有参python函数 1、环境安装&检测 通过C语言调用Python代码,需要先安…

Ubutun部署docker,并使用docker部署springboot项目,关闭软件可继续访问

工具为xftp和xshell。 我这里使用的Ubuntu的版本是20.04的,话不多说,我们来直接上代码。 首先我们最好使用管理员权限进行操作,预防操作时遇到权限问题。 部署docker 登入管理员 不登入管理员也没关系。 su根据提示输入密码,进…

nginx使用与配置文件

nginx服务配置与配置优化 nginx服务脚本配置 mkdir wwwroot cd wwwroot/ mkdir nginx1 touch index.php vim index.php<?php echo $_SERVER["REMOTE_ADDR"]; ​ ​ vim conf/nginx.confserver {listen 80;server_name localhost;root /www/wwwroot/nginx…

【100%成功】从0到1教你开通GPT4.0会员,一年立省1800,拒绝高价代开,免排队无需等待。

我们看下这个网址代开差不多要300&#xff0c;而我用Fomepay每个月才150左右&#xff0c;不需要年费月费&#xff0c;虽然有开卡费用10刀&#xff0c;但是也很划算&#xff0c;你自己算一下&#xff0c;一个月300一年就1千多 点击获取卡&#xff0c;0年费0月费 开卡步骤很简…

在任何 Mac 上恢复永久删除照片的 5 种简单方法

Mac 为业余和专业摄影师提供了很多东西&#xff0c;从令人印象深刻的硬件到广泛的照片管理和编辑应用程序。它还提供了多种恢复丢失照片的方法&#xff0c;我们在本文中介绍了其中的五种方法&#xff0c;以帮助您避免潜在的灾难性情况。 Mac 上删除的照片去了哪里&#xff1f;…

大屏页面 电子数字 制作

字体包下载地址 链接: https://pan.baidu.com/s/1pjslpT5QQi7-oALDM-uX8g 提取码: zxcv 效果展示 使用前使用后 使用方式 1.解压后将文件夹放入public 2.在公用样式中加入 font-face {font-family: mFont;src: url(../../public/DS-Digital/DS-DIGI-1.ttf); } 3. 在项目…

深化涉案企业合规改革:从治标到治本的必由之路

在市场经济的大潮中&#xff0c;企业作为经济发展的主体&#xff0c;其健康运行对整个社会的稳定与繁荣至关重要。然而&#xff0c;随着经济全球化的加速和市场竞争的激烈&#xff0c;一些企业在追求利润最大化的过程中&#xff0c;可能会忽视法律法规&#xff0c;甚至触犯法律…

机器学习知识点复习 下(保研、复试、面试)百面机器学习笔记

机器学习知识点复习下 第八章、采样1.采样的作用 第九章、前向神经网络1.多层感知机与布尔函数2.神经网络中的激活函数3.多层感知机的反向传播算法4.神经网络训练技巧5.深度卷积神经网络6.深度残差网络 第十章、循环神经网络1.循环神经网络和卷积神经网络2.循环神经网络的梯度消…

RustDesk 快速部署,搭建自己的“向日葵”

前言&#xff1a;为什么要搭建自己的远程控制 一直都是用向日葵来做远程控制和一些运维服务提供&#xff0c;but经常性卡出翔&#xff0c;时好时坏&#xff0c;所以萌生了搭建一套自己的远程控制的软件。到目前远程控制的服务器和设置已经搭建完毕&#xff0c;高级的自编译客户…

【Selenium】隐藏元素的定位和操作

一、selenium 中隐藏元素如何定位&#xff1f; 如果单纯的定位的话&#xff0c;隐藏元素和普通不隐藏元素定位没啥区别&#xff0c;用正常定位方法就行了 但是吧~~~能定位到并不意味着能操作元素&#xff08;如click,clear,send_keys&#xff09; 二、隐藏元素 如下图有个输入框…

如何在 Postman 中执行断言测试?

在当今的软件构建流程中&#xff0c;应用程序编程接口&#xff0c;简称 API&#xff0c;起到了不可或缺的作用&#xff0c;它们使得不同的软件应用能够互相沟通和交换数据。随着应用程序的不断演进变得越发复杂&#xff0c;保障API的可靠性及其稳定性显得格外关键。正因如此&am…

ARM64汇编08 - 块访存指令

armv8 里面似乎没有了 v7 中的块访存指令&#xff0c;就是一次性访问一块内存的指令。我们还是先介绍下 v7 中的块访存指令。 V7中的块访存指令​ 手册中介绍了很多种该指令的变种形式&#xff0c;其实了解了这个指令的英文含义就都很好理解。 LD - load&#xff0c;加载 M …

C++:部分题目

1. 封装、继承、多态 封装&#xff1a;将所需的数据成员&#xff0c;以及对数据的操作方法&#xff08;成员函数&#xff09;&#xff0c;绑定在一起成为类&#xff08;类型&#xff09;&#xff0c;定义该类型的对象时&#xff0c;成员被自动隐藏在对象内部。通过封装可以限定…

SOLIDWORKS Simulation子模型分析的使用方法

子模型介绍 SOLIDWORKS Simulation的子模型基于圣维南原理。对于一个比较复杂的模型&#xff0c;如果想升级局部的应力计算精度&#xff0c;就需要对整个模型的网格进行调整并重新进行计算&#xff0c;整个过程耗时较长而且不容易得到满意的结果。 SOLIDWORKS Simulation的子…

【深度学习】训练Stable Diffusion环境

仓库&#xff1a; https://github.com/bmaltais/kohya_ss.git 基础镜像&#xff1a; from kevinchina/deeplearning:sdxllighting_trt_nginx_002api docker run --net host --gpus device0 -e APIWORKS1 -it t1:t1 bash构建环境&#xff1a; sudo -i git clone https://git…

面试常问:为什么 Vite 速度比 Webpack 快

前言 最近作者在学习 webpack 相关的知识&#xff0c;之前一直对这个问题不是特别了解&#xff0c;甚至讲不出个123....&#xff0c;这个问题在面试中也是常见的&#xff0c;作者在学习的过程当中总结了以下几点&#xff0c;在这里分享给大家看一下&#xff0c;当然最重要的是…

【MySQL配置】Windows环境下载并安装MySQL数据库(内含图片,保姆级指引)

一、下载自身所需Mysql 官网链接&#xff1a;https://dev.mysql.com/downloads/installer/ 点击Download后&#xff0c;跳转如下页面。你可以点击注册一个谷歌账号(不是硬性要求)&#xff0c;或者直接如图开始下载。 二、安装所下载的版本 1、双击下载的MySQL文件 2、选择…

深入理解与实践AB测试:从理论到实战案例解析

一、引言 在互联网产品优化和运营策略制定中&#xff0c;AB测试&#xff08;也称为分组测试或随机化对照实验&#xff09;是一种科学且严谨的方法。它通过将用户群体随机分配至不同的实验组&#xff08;通常是A组和B组&#xff09;&#xff0c;对比不同版本的产品或策略对关键…

MySQl基础入门⑫

上一遍文章内容 查询时选择行 1.查询指定记录 假设students表包含字段name, major, 和 email&#xff0c;我们可以构造一个查询来找出所有专业为“计算机科学”且邮箱中包含"university.edu"的学生姓名和邮箱&#xff1a; SELECT name, email FROM students WHER…