ElasticSearch - 基本操作

前言

本文记录 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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫入门:HTTP与URL基础解析及简单示例实践

在数字化时代,数据已成为一种宝贵的资源。Python作为一种强大的编程语言,在数据采集和处理方面表现出色。爬虫技术,即网络爬虫,是Python中用于数据采集的重要工具。本文作为Python爬虫基础教程的第一篇,将深入讲解URL和…

酷开系统满足你的需求,加入酷开会员开启娱乐之旅

酷开科技深知家庭娱乐在我们生活中的重要性,因此,酷开科技不断努力为我们带来更好的内容和服务,在这里,我们能够享受到家庭娱乐的乐趣和便利,感受到酷开科技带来的温暖。电影迷、游戏迷还是音乐爱好者,酷开…

多项式朴素贝叶斯分类器

在这篇文章中,我们介绍多项式朴素贝叶斯分类器是如何工作的,然后使用scikit-learn作为实际工作的示例来介绍如何使用。 与假设高斯分布的高斯朴素贝叶斯分类器相反,多项式朴素贝叶斯分类器依赖于多项分布。通过学习/估计每个类的多项概率来“…

2024 年 6 款最佳 SD 卡恢复软件

“有没有最好的 SD 卡恢复软件可以推荐给我来恢复 SD 卡上丢失的数据?程序太多了。我很难选择合适的存储卡数据恢复软件。” 有一天,我的朋友让我向他推荐最好的SD卡数据恢复软件,因为他在网上搜索,发现有很多选择,而…

JS13-事件的绑定和事件对象Event

绑定事件的两种方式/DOM事件的级别 DOM0的写法&#xff1a;onclick element.onclick function () {}举例&#xff1a; <body> <button>点我</button> <script>var btn document.getElementsByTagName("button")[0];//这种事件绑定的方式…

关于汽车中网改装需要报备吗?(第二天)

车联网改造需要申报吗&#xff1f; 今天2022年10月20日&#xff0c;小编就给大家介绍一下车联网改装是否需要申报的相关知识。 让我们来看看。 汽车格栅改装无需申报。 这种年检可以直接通过。 您不必担心&#xff0c;因为汽车格栅对于实车的外观来说并不陌生&#xff0c;因此…

Docker常用命令!!!

一、docker基础命令 1、启动docker systemctl start docker 2、关闭docker systemctl stop docker 3、重启docker systemctl restart docker 4、docker设置随服务启动而自启动 systemctl enable docker 5、查看docker 运行状态 systemctl status docker 6、查看docker 版本号信…

eth 套利案例五

交易hash : 0xb69981d437af7b9b705b3eb459df89d69901b5aff1cf2f99673372c873d50daf 时间&#xff1a; 2024.02.24 获利&#xff1a; 9699刀 交易流程&#xff1a; 292376226817040592 2940802860 先贷出230个weth, 然后再换成eth 再换成 2940802860 个kekec, 然后再用 29237…

# Django通过开关控制数据库参数(JS版)

目录 场景初始的视图层HTML部分JS代码视图层接受部分 场景 此时我的表单中有一排开关 数据库有一排状态 需求是要当开关开启时数据库state为1&#xff0c;关闭时为0 初始的视图层 将整个adv数据表返回给前端HTML def adv(request):adv_list Adv.objects.all()return rende…

C++项目 -- 负载均衡OJ(一)compile_server

C项目 – 负载均衡OJ&#xff08;二&#xff09;compile_server 文章目录 C项目 -- 负载均衡OJ&#xff08;二&#xff09;compile_server一、compile_server设计1.总体服务流程 二、compiler.hpp三、runner.hpp四、compile_run.hpp五、compile_server.cc5.1.编译功能调试&…

【记录搭建elk 如何在linux共享文件】

『如何在linux共享文件 &#xff0c;搭建elk直接看第二部分』 新增用户a b c adduser a adduser b adduser c新增用户组 A groupadd developteam将用户a b c 加入 组 usermod -a -G developteam hadoop usermod -a -G developteam hbase usermod -a -G developteam hive设置um…

拷贝他人maven仓库jar包到自己本地仓库,加载maven依然提示无法下载对应依赖

所遇问题&#xff1a; 拷贝他人maven仓库jar包到自己本地maven仓库repository下的对应依赖位置&#xff0c;重新加载idea的maven依然提示无法下载对应依赖。 解决办法&#xff1a; 在maven->repository找到对应报错依赖路径&#xff0c;删除xxx.repositories 和 xxx.lastU…

蓝桥杯算法心得——附近最小(优先队列+滑动窗口)

大家好&#xff0c;我是晴天学长&#xff0c;这题可以用贪心优先队列和滑动窗口来写&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .附近最小 问题描述 小蓝有—个序列a[1], a[2],...,a[n]。 给定—个…

【MySQL】7. 基本查询(create / retrieve)

表的增查 CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; 1. Create 语法&#xff1a; INSERT [INTO] table_name[(column [, column] ...)] VALUES (value_list) [, (value_list)] ...value_list: value, […

【办公类-16-07-07】“2023下学期 大班户外游戏2(有场地和无场地版,每天不同场地)”(python 排班表系列)

作品展示 背景需求&#xff1a; 2024年2月教务组发放的是“每周五天内容相同&#xff0c;两周10天内容相同”的户外游戏安排 【办公类-16-07-05】合并版“2023下学期 大班户外游戏&#xff08;有场地和无场地版&#xff0c;两周一次&#xff09;”&#xff08;python 排班表系…

探秘国内ip切换手机软件,全是干货,火速Get!

随着互联网的普及和深入&#xff0c;人们在网络空间中的活动也变得越来越频繁。然而&#xff0c;在享受网络便利的同时&#xff0c;个人隐私保护和数据安全问题愈发突出。国内IP切换手机软件因其功能多样、易用性强大而备受关注。这类软件可以帮助用户切换IP地址&#xff0c;隐…

百度智能云+SpringBoot=AI对话【人工智能】

百度智能云SpringBootAI对话【人工智能】 前言版权推荐百度智能云SpringBootAI对话【人工智能】效果演示登录AI对话 项目结构后端开发pom和propertiessql_table和entitydao和mapperservice和implconfig和utilLoginController和ChatController 前端开发css和jslogin.html和chat.…

Java newInstance方法学习

用newInstance与用new是有区别的&#xff0c;区别在于创建对象的方式不一样&#xff0c;前者是使用类加载机制&#xff1b; newInstance方法要求该 Class 对应类有无参构造方法&#xff1b; 执行 newInstance()方法实际上就是使用对应类的无参构造方法来创建该类的实例&#x…

【prometheus-operator】k8s监控集群外redis

1、部署exporter GitHub - oliver006/redis_exporter: Prometheus Exporter for Redis Metrics. Supports Redis 2.x, 3.x, 4.x, 5.x, 6.x, and 7.x redis_exporter-v1.57.0.linux-386.tar.gz # 解压 tar -zxvf redis_exporter-v1.57.0.linux-386.tar.gz # 启动 nohup ./redi…

流畅的 Python 第二版(GPT 重译)(三)

第五章&#xff1a;数据类构建器 数据类就像孩子一样。它们作为一个起点是可以的&#xff0c;但要作为一个成熟的对象参与&#xff0c;它们需要承担一些责任。 马丁福勒和肯特贝克 Python 提供了几种构建简单类的方法&#xff0c;这些类只是一组字段&#xff0c;几乎没有额外功…