Elasticsearch快速上手

news2024/11/28 18:53:33

基本概念

索引(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 的基本概念已经了解了,也知道如何对文档做简单的增删改查操作了,现在就开始动手试一试吧!

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

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

相关文章

电脑怎么录屏带声音?这么操作就对了!

随着数字化时代的快速发展,电脑录屏带声音的需求逐渐增多。无论是为了制作教学视频、游戏解说,还是为了记录会议内容,一个稳定、易用的录屏工具都是必不可少的,可是电脑怎么录屏带声音呢?本文将介绍两种电脑录屏方法&a…

五一假期来临,各地景区云旅游、慢直播方案设计与平台搭建

一、行业背景 经文化和旅游部数据中心测算,今年清明节假期3天全国国内旅游出游1.19亿人次,按可比口径较2019年同期增长11.5%;国内游客出游花费539.5亿元,较2019年同期增长12.7%。踏青赏花和户外徒步成为假期的热门出游主题。随着…

C++模仿qq界面

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口的大小this->resize(645,497);//设置窗口名字this->setWindowTitle("QQ");//设置窗口图标this->setWindowIcon(QIcon("C:\\zhouzhouMyfile\\qt_proj…

Java知识体系最强总结(2024版)

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

LLM - 大语言模型(LLM) 的 应用技术

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/137503579 大语言模型(LLM) 的应用技术范围非常广泛,即: LangChain:开发框架,专为大型语言模型设计,以提高开发人工智能应用的效率,允许开发者将语言模…

基于springboot实现墙绘产品展示交易平台管理系统项目【项目源码+论文说明】

基于springboot实现墙绘产品展示交易平台系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本墙绘产品展示交易平台就是在这样的大环境下诞生&#xff…

蓝桥杯练习系统(算法训练)ALGO-958 P0704回文数和质数

资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 一个数如果从左往右读和从右往左读数字是完全相同的,则称这个数为回文数,比如898,1221,15651都是回文数。编写…

[STL-list]介绍、与vector的对比、模拟实现的迭代器问题

一、list使用介绍 list的底层是带头双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行…

nginx部署前端教程

目录 一、前言二、部署三、注意四、参考 一、前言 一般来说现在的软件项目,都是分用户端以及管理端的,并且是前后端分离的,这里我来记录一下部署两个前端的教程。 部署前端之前需要的准备工作是部署springBoot后端程序,这里我do…

性能分析-nginx

tomcat 像kyj项目请求直接对接 tomcat,tomcat的连接池就会直接影响“并发用户数” 如果这种情况下做性能测试的时候,并发用户数不能满足要求,可以适当加大线程池的配置。 如:项目性能测试发现项目所在机器,资源利用率…

conda创建虚拟环境太慢,Collecting package metadata (current_repodata.json): failed

(省流版:只看加粗红色,末尾也有哦) 平时不怎么用conda,在前公司用服务器的时候用的是公司的conda源,在自己电脑上直接用python创建虚拟环境完事儿,所以对conda的配置并不熟悉~~【狗头】。但是python虚拟环境的最大缺点…

每日面经:计算机网络part1

1. 计算机网络的组成部分有哪些? a. 硬件设备:计算机网络由各种硬件设备组成,包括计算机、服务器、路由器、交换机、网卡等。这些设备通过物理连接(如网线、光纤)相互连接。 b. 协议:计算机网络中的通信需…

二、计算机网络物理层基础知识

一、物理层 物理层接口特性:解决如何在连接各种计算机传输媒体上的传输数据比特流,而不是指具体的传输媒体 物理层的主要任务 :确定与传输媒体接口有关的一些特性>定义标准 1、机械特性:定义物理连接的特性,规定物理…

【C++】RapidJSON 设置支持 std::string,防止编译报错

问题 rapidjson 创建 json 数据,使用 std::string 字符串进行赋值,编译时,抱一堆错误 .... rapidjson/include/rapidjson/document.h:690:5: note: candidate expects 0 arguments, 1 provided [build] make[2]: *** [main/CMakeFiles/ma…

软件杯 深度学习人体语义分割在弹幕防遮挡上的实现 - python

文章目录 1 前言1 课题背景2 技术原理和方法2.1基本原理2.2 技术选型和方法 3 实例分割4 实现效果5 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习人体语义分割在弹幕防遮挡上的应用 该项目较为新颖,适合作为竞…

基于Springboot4S店车辆管理系统

采用技术 基于Springboot4S店车辆管理系统的设计与实现~ 开发语言:Java 数据库:MySQL 技术:SpringBootMyBatis 工具:IDEA/Ecilpse、Navicat、Maven 页面展示效果 管理员功能 首页 销售员管理 维修员管理 客户管理 供应…

前端开发之Element树结构组件el-input的type=“password“时候账号密码自动填充解决方案

Element树结构组件el-input的type“password“时候账号密码自动填充解决方案 前言效果图解决方案 前言 在使用element的input的password当参数和login的参数相同时,在浏览器保存的用户名密码会自动填充,导致input附加上默认值 使用场景一般是在用户管理…

海量智库 | ANY权限原理介绍

ANY权限是Vastbase中的一种特殊的管理权限,用户能够通过ANY权限执行更广泛的操作,更加便利的管理数据库。 本文将为您介绍ANY权限管理的相关原理。 ANY权限管理相关解释 ANY权限管理,是对数据库内的某一类对象的所有实体进行特定的权限管理…

数据产品+AI产品 通关上岸,创建能带来商业价值的AI产品,学习AI产品开发

数据产品 AI产品 通关上岸,创建能带来商业价值的AI产品,学习AI产品开发流程 数据产品+AI产品 通关上岸,创建能带来商业价值的AI产品,学习AI产品开发 - 百创网-源码交易平台_网站源码_商城源码_小程序源码 人工智能快速渗入到各个行业,AI产品经理缺口高达6.8万,成为稀缺…

数字电子基础——编码器

编码器 编码:用文字、符号或数字表示特定对象的过程。在数字电路中,采用二进制进行编码 编码器:实现编码功能的电路 二进制编码器 用 n n n 位二进制代码对 N 2 n N2^n N2n 个信号进行编码的电路 应用举例 【例】设计一个能将 I 0 、…