Elasticsearch快速上手

基本概念

索引(Index)
索引是文档的容器,就像关系数据库中,要存储行记录必须先创建数据库和表一样。

类型(Type)
ES6 及之前的版本还存在”类型“的概念,一个索引下可以存储多个类型的文档,但是不同类型下的文档却不是相互独立的,这些文档同属于一个 Lucene 索引,仅通过_type字段做逻辑区分,导致不同类型下的相同字段名无法实现不同的数据类型而出现问题,于是 ES7 废弃了类型的概念,ES8 彻底移除了类型。

文档(Document)
文档是可以被索引的最小信息单元,相当于关系数据库中的行记录。文档由若干个字段(Field)组成,每个字段是一个键值对。在 ES 中,文档有两个特点:自包含、无模式。
自包含的意思是:每个文档都是一个独立的实体,它包含了文档有关的所有信息,包括键名和键值,不像关系数据库还得依靠表定义才能解析出完整的行记录。自包含的特性使得 ES 更好的处理半结构化或非结构化的数据。
无模式的意思是:可以在不事先定义任何结构或模式的前提下直接索引文档,也不要求每个文档都具有相同的结构。这个特性使得 ES 适合处理不确定结构或需要频繁更改的数据,而无需担心频繁变更结构和架构的麻烦。

映射(Mapping)
映射有点类似于关系数据库里的表结构定义,它用来定义索引有哪些字段,字段类型是什么?以及字段索引或搜索时使用哪个分析器等等。

除此之外,还有其它一些概念,虽然不影响入门使用,但是也可以了解一下:ES 数据类型、倒排索引、分析器、TF-IDF 算法、ES 集群、分片&副本。

安装启动

在 https://www.elastic.co/downloads/elasticsearch 页面选择对应平台的安装包下载安装,最新版本是 8.11.1,笔者是 Mac 平台,直接进入解压后的目录,启动 ES:

sh bin/elasticsearch

ES 默认的端口是 9200,请求一下返回如下内容代表启动成功:

> curl 127.0.0.1:9200
{
  "name" : "localhost-5.local",
  "cluster_name" : "fx",
  "cluster_uuid" : "pmtpInc2RA2Hu_4mFqRhQw",
  "version" : {
    "number" : "8.11.1",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "6f9ff581fbcde658e6f69d6ce03050f060d1fd0c",
    "build_date" : "2023-11-11T10:05:59.421038163Z",
    "build_snapshot" : false,
    "lucene_version" : "9.8.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

为了方便操作,推荐一并安装 Kibana:https://www.elastic.co/downloads/kibana,修改kibana.yml配置文件,让 Kibana 连接上 ES:

elasticsearch.hosts: ["http://127.0.0.1:9200"]

启动 Kibana:

sh bin/kibana

启动成功后就可以通过下面的地址访问 Kibana UI 界面了

http://127.0.0.1:5601

首页找到 “开发工具” 就可以进入控制台,非常方便的操作 ES 了,ES 提供了 Restful 风格的 API,这里本质就是发请求到 ES。
image.png

简单CRUD

先不管什么索引和映射,因为 ES 文档是无模式的,所以我们可以在事先没有任何定义的情况下,直接索引文档。

索引文档

例如,我们索引两个商品,包含名称和价格(单位:分)

POST items/_doc
{
  "title": "苹果",
  "price": 500
}
POST items/_doc
{
  "title": "草莓",
  "price": 1800
}

查询一下,验证文档是否被索引:

GET items/_search?q=*

"hits": [
  {
    "_index": "items",
    "_id": "9eojFYwBN8lyBibQW7at",
    "_score": 1,
    "_source": {
      "title": "苹果",
      "price": 500
    }
  },
  {
    "_index": "items",
    "_id": "9uojFYwBN8lyBibQXrYH",
    "_score": 1,
    "_source": {
      "title": "草莓",
      "price": 1800
    }
  }
]

更新文档

ES 更新文档有两种方式:覆盖更新、增量更新。前者需要提供完整的文档完成替换,后者只需要提供要更新的字段即可,已存在的字段会修改,没有的字段会插入。

先看增量更新,例如,我们现在要把苹果的价格调整为四元:

POST items/_update/9eojFYwBN8lyBibQW7at
{
  "doc": {
    "price": 400
  }
}

获取文档发现只有价格变了,标题没变:

GET items/_doc/9eojFYwBN8lyBibQW7at

{
  "_index": "items",
  "_id": "9eojFYwBN8lyBibQW7at",
  "_version": 2,
  "_seq_no": 2,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "title": "苹果",
    "price": 400
  }
}

反观覆盖更新,如果我们只发送变更后的价格,那么除了价格外的其它字段都会被删掉。

POST items/_doc/9eojFYwBN8lyBibQW7at
{
  "price": 500
}

获取文档发现只剩下price字段了,覆盖更新时要格外注意!

GET items/_doc/9eojFYwBN8lyBibQW7at

{
  "_index": "items",
  "_id": "9eojFYwBN8lyBibQW7at",
  "_version": 3,
  "_seq_no": 3,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "price": 500
  }
}

除此之外,ES 还提供了一种非常强大的更新操作:通过查询更新。
例如,我们现在要把价格高于 10 元的商品打一个“高价商品”的标签,就可以这么做:

POST items/_update_by_query
{
  "query": {
    "range": {
      "price": {
        "gte": 1000
      }
    }
  },
  "script": {
    "source": "ctx._source.tags=['高价商品']",
    "lang": "painless"
  }
}

再次查询文档:

GET items/_search

"hits": [
  {
    "_index": "items",
    "_id": "9uojFYwBN8lyBibQXrYH",
    "_score": 1,
    "_source": {
      "price": 1800,
      "title": "草莓",
      "tags": [
        "高价商品"
      ]
    }
  },
  {
    "_index": "items",
    "_id": "9eojFYwBN8lyBibQW7at",
    "_score": 1,
    "_source": {
      "title": "苹果",
      "price": 500
    }
  }
]

正如之前所说的,ES 文档是无模式的,所以我们可以很轻松的新增 tags 字段。

删除文档

ES 也提供了两种删除文档的方式:根据文档 ID 删除、根据查询删除。
前者需要提供文档 ID,例如我们根据苹果的文档 ID 来删除:

DELETE items/_doc/9eojFYwBN8lyBibQW7at

再例如,我们根据查询来删除文档,把包含“草莓”的商品全部删掉:

POST items/_delete_by_query
{
  "query": {
    "match": {
      "title": "草莓"
    }
  }
}

如此一来,items 索引下就没有任何文档了。

查询文档

为了有文档可以搜索,这里把上节删除的文档重新索引。

ES 最强大的功能就是搜索,但是作为快速入门,这里只介绍最简单的文档查询方式。
例如,你可以根据文档 ID 获取文档,严格来说这不算是搜索:

GET items/_doc/-OrdFYwBN8lyBibQtLZu

{
  "_index": "items",
  "_id": "-OrdFYwBN8lyBibQtLZu",
  "_version": 1,
  "_seq_no": 10,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "title": "苹果",
    "price": 500
  }
}

也可以通过关键词搜索商品名称:

POST items/_search
{
  "query": {
    "match": {
      "title": "莓"
    }
  }
}

"hits": [
  {
    "_index": "items",
    "_id": "-erdFYwBN8lyBibQtLaO",
    "_score": 0.6931471,
    "_source": {
      "title": "草莓",
      "price": 1800
    }
  }
]

搜索时的关键字哪怕你输入“蓝莓”也能搜索出“草莓”,因为 title 字段被 ES 自动映射为 text 类型了,字段会被分析器分词后再索引,默认的分词器会把“草莓” 拆分成:“草”和“莓”,搜索时的“蓝莓”也会先经过分析,结果是二者的“莓”这个词能匹配上。

尾巴

现在你对 ES 的基本概念已经了解了,也知道如何对文档做简单的增删改查操作了,现在就开始动手试一试吧!

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

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

相关文章

探索数据结构:特殊的双向队列

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty’s blog 1. 双向队列的定义 **双向队列(double‑ended queue)**是一种特殊的队列…

Ant Design Pro | 前端项目初始化

初始化项目 环境确认 这里使用的版本如下: 新建文件夹(fapi) 执行项目初始化命令 cmd进入命令行执行项目初始化命令,参考官网https://pro.ant.design/zh-CN/ # 使用 npm npm i ant-design/pro-cli -g # fapi-frontend是项目…

树莓派固件烧录教程(2024)

一、烧录工具准备 硬件准备: 16G及以上TF卡和读卡器,TF卡建议高速卡(卡的读写速度直接影响树莓派的运行速度)。 软件准备:(下面二方法选其一即可) 方法1:raspberry官方烧录工具R…

【高校科研前沿】中国科学院南京地理与湖泊研究所肖启涛博士为一作在Sci. Bull发文:我国湖泊二氧化碳从大气的源向汇转变

目录 1.文章简介 2.研究内容 3.文章引用 1.文章简介 论文名称:Lakes shifted from a carbon dioxide source to a sink over past two decades in China 第一作者及通讯作者:肖启涛(博士生),段洪涛(研究…

JavaSE继承和多态(下)

在了解多态之前我们先弄清以下三个概念: 方法的重写向上转型和向下转型动态绑定和静态绑定 一.方法的重写 重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程 进行重新编写,…

如何使用 langchain 与 openAI 连接

上一篇写了如何安装 langchain https://www.cnblogs.com/hailexuexi/p/18087602 这里主要说一个 langchain的使用 创建一个目录 langchain ,在这个目录下创建两个文件 main.py 这段python代码,用到了openAI,需要openAI及FQ。这里只做…

c++的学习之路:16、string(3)

上章有一些东西当时没学到,这里学到了将在补充,文章末附上代码,思维导图。 目录 一、赋值重载 二、带模板的创建 三、析构函数 四、代码 五、思维导图 一、赋值重载 这里的赋值重载就是直接利用交换函数进行把传参生成的临时数据和需要…

IDEA中的Debug功能介绍

说明:本文介绍IDEA中的Debug功能,基于2023.2(Ultimate Edition)版本 简单介绍 首先,在程序需要停止的所在行号上,鼠标左键,可设置一个断点,是一个红色圆点标志,表示程序…

2023年下半年中级软件设计师上午真题及答案解析

01 02 03 04 05 06 07 08 09 10 篇幅有限,私我获取免费完整 pdf文件

php反序列化题目

[NewStarCTF 公开赛赛道]UnserializeOne 分析代码,最终需要调用到 file_get_contents 即可获得flag 从后往前分析 触发 __invoke 需要 以调用函数的方式调用一个对象 可以找到Start类 里的__isset中可以将类当作函数调用 所以需要调用到 __isset 就需要 isset()…

Steam上线真人乙游,女性玩家还愿意买单吗?

Steam上线了一款真人乙游《糟糕!他们太爱我了怎么办?》(以下简称《糟糕!)。 乍一听这个游戏名,似乎和《完蛋!我被美女包围了!》有异曲同工之妙,事实也确实如此&#xff…

实现通讯录(顺序表版本)

一、功能要求 (1)⾄少能够存储100个⼈的通讯信息 (2)能够保存⽤⼾信息:名字、性别、年龄、电话、地址等 (3)增加联系⼈信息 (4)删除指定联系⼈ (5&#…

国内:深圳交通流量数据集

数据来源:深圳政府数据开放平台(深圳市政府数据开放平台),这个官网上还有其他类数据集,值得收藏!!! 数据集介绍:宝安区-G4高速西乡大道入口车流量统计 第一行每列的标题…

什么是超导悬浮?工作原理是什么?

某些材料在冷却到某个温度(也称为“临界温度”)以下时会完全失去电阻。 1910 年,一位名叫 Heike Kamerlingh Onnes 的荷兰物理学家发现了这一现象。他注意到低于一定温度时电阻突然下降,然后他大胆地声称发现了一种新的物质状态&a…

字符串处理

读取 先定义: char ch[100];string s; cin>>s或cin>>ch以空格或换行符结束gets(ch);//gets只能读字符数组,不能直接读字符串stringgets和getline会把第一次出现的换行符及先前的字符串读进去(包括空格)&#xff0…

利用Flutter框架实现iOS应用的跨平台发布策略

本文探讨了使用Flutter开发的iOS应用能否上架,以及上架的具体流程。苹果提供了App Store作为正式上架渠道,同时也有TestFlight供开发者进行内测。合规并通过审核后,Flutter应用可以顺利上架。但上架过程可能存在一些挑战,因此可能…

【Linux】正则表达式实验操作实例

正则表达式是一种强大的工具,用于在文本中查找、匹配和替换特定的字符串模式。 实验目的 掌握正则表达式的表达方式掌握grep/egrep命令的用法掌握sed 命令的用法掌握awk命令的用法 正则表达式 实验目的实验内容实验过程创建grep文件来进行如下操作用sed命令完成下列…

HAL STM32 定时器PWM DMA输出方式

HAL STM32 定时器PWM DMA输出方式 🧨遗留问题:当配置RCR重复计数器,配置为2时,在定义了3组PWM参数情况下,只能输出第二组参数的PWM波形。(HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, aCCValue_Buff…

Java中网络编程,Junit单元测试详解

文章目录 软件结构C/S结构B/S结构 概述三要素IP (银行的位置)端口 (银行中某个柜台号)协议 (填写取款单的规则)TCP通信程序TCP通信原理客户端发送数据服务端接收数据过程图三次握手 Junit单元测试概述常见的注解使用断言概述使用 软件结构 C/S结构 客户…

怀俄明探空站数据解算PWV和Tm

1. Matlab 获取代码可关注公众号WZZHHH回复(怀俄明探空站数据解算PWV和Tm),或者咸鱼关注:WZZHHH123 怀俄明探空站数据解算PWV和Tm: 有关 Matlab 获取代码可关注公众号WZZHHH回复(怀俄明多线程下载&#…