技术栈ES的介绍和使用
目录
- 1. 全文搜索引擎(Elastic Search)的由来
- 2. Elastic Search 概述
- 2.1 Elastic Search 介绍
- 2.2 Elastic Search 功能
- 2.3 Elastic Search 特点
- 3. 安装 Elastic Search
- 3.1 ES 的安装
- 3.2 安装 kibana
- 3.3 ES 客户端的安装
- 4. Elastic Search 基本概念
- 4.1 集群(Cluster)
- 4.2 节点(Node)
- 5. 索引&类型&文档&字段&映射
- 5.1 索引(Index)
- 5.2 类型(Type)
- 5.3 文档(Document)
- 5.4 映射(Mapping)
- 6. 分片&副本
- 6.1 分片(Shards)
- 6.2 副本(Replicas)
- 6.3 分析器
- 7. ES RESTful 操作
- 7.1 索引操作
- 7.1.1 创建索引
- 7.1.2 查看索引
- 7.1.3 删除索引
- 7.2 类型操作
- 7.2.1 创建类型
- 7.2.2 查看类型
- 7.3 文档操作
- 7.3.1 增加文档
- 7.3.2 查看文档
- 7.3.3 修改文档
- 7.3.4 删除文档
- 8. 倒排索引
- 9. Elastic Search 总结
1. 全文搜索引擎(Elastic Search)的由来
(1)当系统数据量上了10亿、100亿条的时候,我们用什么数据库好?如何解决单点故障?如何提升检索速度?如何解决统计分析问题?
- 传统数据库的应对解决方案:
- 关系型数据库:
- 通过主从备份解决数据安全性问题;
- 通过数据库代理中间件心跳监测,解决单点故障问题;
- 通过代理中间件将查询语句分发到各个slave节点进行查询,并汇总结果;
- 非关系型数据库:
- 通过副本备份保证数据安全性;
- 通过节点竞选机制解决单点问题;
- 先从配置库检索分片信息,然后将请求分发到各个节点,最后由路由节点合并汇总结果;
- 关系型数据库:
- 另辟蹊径
- 存储数据时按有序存储;
- 将数据和索引分离;
- 压缩数据;
- 于是,Elastic Search就在这种背景下诞生了。
2. Elastic Search 概述
2.1 Elastic Search 介绍
(1)介绍如下:
- Elatic search,简称为 ES, ES 是一个开源的高扩展的分布式全文搜索引擎,是整个 Elastic Stack 技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。
- Elastic search是一个分布式、可扩展、近实时的高性能搜索与数据分析引擎。Elastic search基于Apache Lucene构建,采用Java编写,并使用Lucene构建索引、提供搜索功能。Elastic search的目标是让全文搜索功能的落地变得简单。
2.2 Elastic Search 功能
(1)具体功能如下:
- Lucene 是开源的搜索引擎工具包,Elastic search 充分利用Lucene,并对其进行了扩展,使存储、索引、搜索都变得更快、更容易, 而最重要的是, 正如名字中的“ elastic ”所示, 一切都是灵活、有弹性的。而且,应用代码也不是必须用Java 书写才可以和Elastic search兼容,完全可以通过JSON 格式的HTTP 请求来进行索引、搜索和管理Elastic search 集群。
- Elasticsearch是一个基于Apache Lucene™的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
- 但是,Lucene只是一个库。想要发挥其强大的作用,你需使用Java并要将其集成到你的应用中。Lucene非常复杂,你需要深入的了解检索相关知识来理解它是如何工作的。
- Elastic search也是使用Java编写并使用Lucene来建立索引并实现搜索功能,但是它的目的是通过简单连贯的RESTful API让全文搜索变得简单并隐藏Lucene的复杂性。
(2)不过,Elastic search不仅仅是Lucene和全文搜索引擎,它还提供:
- 分布式的实时文件存储,每个字段都被索引并可被搜索。
- 实时分析的分布式搜索引擎。
- 可以扩展到上百台服务器,处理PB级结构化或非结构化数据 而且,所有的这些功能被集成到一台服务器,你的应用可以通过简单的RESTful API、各种语言的客户端甚至命令行与之交互。
(3)上手Elasticsearch非常简单,它提供了许多合理的缺省值,并对初学者隐藏了复杂的搜索引擎理论。
- 它开箱即用(安装即可使用),只需很少的学习既可在生产环境中使用。
- Elastic search在Apache 2 license下许可使用,可以免费下载、使用和修改。 随着知识的积累,你可以根据不同的问题领域定制Elastic search的高级特性,这一切都是可配置的,并且配置非常灵活。
2.3 Elastic Search 特点
(1)特点如下所示:
- 分布式实时文件存储。Elasticsearch可将被索引文档中的每一个字段存入索引,以便字段可以被检索到。
- 实时分析的分布式搜索引擎。Elasticsearch的索引分拆成多个分片,每个分片可以有零个或多个副本。集群中的每个数据节点都可承载一个或多个分片,并且协调和处理各种操作;负载再平衡和路由会自动完成。
- 高可拓展性。大规模应用方面,Elasticsearch可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。当然,Elasticsearch也可以运行在单台PC上。
- 可插拔插件支持。Elasticsearch支持多种插件,如分词插件、同步插件、Hadoop插件、可视化插件等。
3. 安装 Elastic Search
3.1 ES 的安装
# 添加仓库秘钥
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
# 上边的添加方式会导致一个 apt-key 的警告,如果不想报警告使用下边这个
curl -s https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --no-default-keyring --keyring gnupgring:/etc/apt/trusted.gpg.d/icsearch.gpg --import
# 以上两种方法二选一# 添加镜像源仓库
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elasticsearch.list
# 更新软件包列表
sudo apt update
# 安装 es
sudo apt-get install elasticsearch=7.17.21
# 启动 es
sudo systemctl start elasticsearch
# 安装 ik 分词器插件
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/7.17.21
3.2 安装 kibana
# 使用 apt 命令安装 Kibana。
sudo apt install kibana
# 配置 Kibana(必选):根据需要配置 Kibana。配置文件通常位于 /etc/kibana/kibana.yml。可能需要设置如服务器地址、端口、Elasticsearch URL 等。
sudo vim /etc/kibana/kibana.yml
# 例如,你可能需要设置 Elasticsearch 服务的 URL: 大概 32 行左右elasticsearch.host: "http://localhost:9200"
# 修改如下位置并且将注释去除:
# server.host: "0.0.0.0"# 启动 Kibana 服务:
sudo systemctl start kibana
# 设置开机自启(可选):如果你希望 Kibana 在系统启动时自动启动,可以使用以下命令来启用自启动。
sudo systemctl enable kibana
# 验证安装:使用以下命令检查 Kibana 服务的状态。
sudo systemctl status kibana
# 访问 Kibana:在浏览器中访问 Kibana,通常是 http://<your-ip>:5601
3.3 ES 客户端的安装
# 先安装依赖
sudo apt-get install libmicrohttpd-dev
# 克隆代码
git clone https://github.com/seznam/elasticlient
# 切换目录
cd elasticlient
# 更新子模块
git submodule update --init --recursive
# 编译代码
mkdir build && cd build
# cmake生成Makefile
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
# 安装
make && sudo make install
4. Elastic Search 基本概念
(1)基本概念:
- Elasticsearch就被设计为能处理数以亿计的文档和每秒数以百计的搜索请求的分布式解决方案。这归功于几个重要的概念,我们现在将更详细地描述。
(2)节点&集群:
- Elastic search 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic search 实例。单个 Elastic search 实例称为一个节点(Node),一组节点构成一个集群(Cluster)。节点&集群的详细介绍如下。
4.1 集群(Cluster)
(1)集群的概念:
- 集群是一个或多个节点的集合,它们共同保存您的整个数据,并提供跨所有节点的联合索引和搜索功能。群集由唯一的名称标识,默认情况下为“elasticsearch”。此名称很重要,因为如果节点设置为按名称加入群集,则该节点只能是群集的一部分。
- 确保不要在不同的环境中重用相同的群集名称,否则很可能会导致节点加入错误的群集。例如,您可以使用logging-dev,logging-stage以及logging-prod用于开发,预发和生产环境。
- 值得注意的是,如果群集中只有一个节点,那么它是完全正常的。此外,您还可以拥有多个独立的集群,每个集群都有自己唯一的集群名称。
4.2 节点(Node)
(1)节点的概念:
- 节点是作为集群一部分的单个服务器,存储数据并参与集群的索引和搜索功能。就像集群一样,节点由名称标识,默认情况下,该名称是在启动时分配给节点的随机通用唯一标识符(UUID)。如果不需要默认值,可以定义所需的任何节点名称。此名称对于管理目的非常重要,您可以在其中识别网络中哪些服务器与Elasticsearch集群中的哪些节点相对应。
- 可以将节点配置为按集群名称加入特定群集。默认情况下,每个节点都设置为加入一个名为cluster的集群elasticsearch,这意味着如果您在网络上启动了许多节点并且假设它们可以相互发现,它们将自动形成并加入一个名为elasticsearch的集群。
- 在单个集群中,可以拥有任意数量的节点。此外,如果网络上当前没有其他Elasticsearch节点正在运行,则默认情况下启动单个节点将形成一个名为elasticsearch的新单节点集群。
5. 索引&类型&文档&字段&映射
(1)和数据库的映射关系如下图:
(2)什么是 index (索引) ?
- 一个 索引 就是一个拥有几分相似特征的文档的集合。ES 将数据存储于一个或多个索引中,索引 就相当于 SQL 中的一个数据库。
(3)什么是 Type(类型)?
- 类型是索引内部的逻辑分区(category/partition),然而其意义完全取决于用户需求。因此,一个索引内部可定义一个或多个类型(type)。一般来说,类型就是为那些拥有相同的域的文档做的预定义。类比传统的关系型数据库领域来说,类型 相当于 表,7.x 版本默认使用 _doc 作为 type 。
(4)什么是 Document(文档)?
- 文档是 Lucene 索引和搜索的 原子单位,它是包含了一个或多个域的容器,基于 Json 格式进行表示。文档有一个或多个域组成,每个域拥有一个名字及一个或多个值,有多个值的域通常被称为 多值域,每个文档可以存储不同的域集,但同一类型下的文档至应该有某种程度上的相似之处。相当于 mysql 表中的 row 。
(5)什么是 Field (字段)?
- Field 是相当于数据库中的 Column。
(6)上述索引&类型&文档&字段结构图如下:
(7)什么是 Mapping(映射)?
- Mapping 是定义文档及其包含的字段如何存储和索引的过程。Mapping 是 ES 中的一个很重要的内容,它类似于传统关系型数据中 table 的 schema,用于定义一个索引(index)的某个类型(type)的数据结构。
5.1 索引(Index)
(1)索引的概念:
- 索引是具有某些类似特征的文档集合。 例如,可以给客户数据建立一个索引,给产品目录建立另一个索引或给订单数据的建立一个索引。
- 索引有一个名称标识(必须全部小写),此名称用于在对其中的文档执行索引,搜索,更新和删除操作时引用索引所用。 在单个群集中,您可以根据需要定义任意数量的索引。
- 索引 (index)是Elasticsearch对逻辑数据的逻辑存储,所以它可以分为更小的部分。你可以把索引看成关系型数据库的表。然而,索引的结构是为快速有效的全文索引准备的,特别是它不存储原始值。
- Elasticsearch可以把索引存放在一台机器或者分散在多台服务器上,每个索引有一或多个分片 (shard),每个分片可以有多个副本 (replica)。
5.2 类型(Type)
(1)类型的概念:
- type是一个逻辑意义上的分类或者叫分区,允许在同一索引中建立多个type。本质是相当于一个过滤条件,高版本将会废弃type概念。
- 不同_type下的字段不能冲突,删除整个_type也不会释放空间。在实际应用中,数据模型不同,有不同_type需求的时候,我们应该建立单独的索引,而不是在一个索引下使用不同的_type。删除过期老化的数据时,最好以索引为单位,而不是_type和_id。
- 正由于_type在实际应用中容易引起概念混淆,以及允许索引存在多_type并没有什么实际意义,在ES 6.x版本中,一个索引只允许存在一个_type,未来的7.x版本将完全删除_type的概念。
5.3 文档(Document)
(1)文档的概念:
- 文档是可以编制索引的基本信息单元。例如,您可以为单个客户提供文档,为单个产品提供另一个文档,为单个订单提供另一个文档。该文档以JSON(JavaScript Object Notation)表示,JSON是一种普遍存在的互联网数据交换格式。
- ES是面向文档的。各种文本内容以文档的形式存储到ES中,文档可以是一封邮件、一条日志,或者一个网页的内容。一般使用 JSON 作为文档的序列化格式,文档可以有很多字段,在创建索引的时候,我们需要描述文档中每个字段的数据类型,并且可能需要指定不同的分析器,就像在关系型数据中“CREATE TABLE”一样。
- 在索引/类型中,可以根据需要存储任意数量的文档。 值得注意的是,尽管文档实际上驻留在索引中,但实际上必须将文档分配给索引中的一个类型(type)中。
- 在存储结构上,由_index、_type和_id唯一标识一个文档。
- _index指向一个或多个物理分片的逻辑命名空间,_type类型用于区分同一个集合中的不同细分,在不同的细分中,数据的整体模式是相同或相似的,不适合完全不同类型的数据。多个_type可以在相同的索引中存在,只要它们的字段不冲突即可(对于整个索引,映射在本质上被“扁平化”成一个单一的、全局的模式)。_id文档标记符由系统自动生成或使用者提供。
- 存储在Elastic search中的主要实体叫文档 (document)。用关系型数据库来类比的话,一个文档相当于数据库表中的一行记录。Elasticsearch的文档中,相同字段必须有相同类型。这意味着,所有包含title 字段的文档,title 字段类型都必须一样,比如string 。
- 文档由多个字段 组成,每个字段可能多次出现在一个文档里,这样的字段叫多值字段 (multivalued)。每个字段有类型,如文本、数值、日期等。字段类型也可以是复杂类型,一个字段包含其他子文档或者数组。字段类型在Elasticsearch中很重要,因为它给出了各种操作(如分析或排序)如何被执行的信息。幸好,这可以自动确定,然而,我们仍然建议使用映射。
- 与关系型数据库不同,文档不需要有固定的结构,每个文档可以有不同的字段,此外,在程序开发期间,不必确定有哪些字段。当然,可以用模式强行规定文档结构。
- 从客户端的角度看,文档是一个JSON对象。每个文档存储在一个索引中并有一个Elasticsearch自动生成的唯一标识符和文档类型 。文档需要有对应文档类型的唯一标识符,这意味着在一个索引中,两个不同类型的文档可以有相同的唯一标识符。
(2)文档类型:
- 在Elasticsearch中,一个索引对象可以存储很多不同用途的对象。例如,一个博客应用程序可以保存文章和评论。文档类型让我们轻易地区分单个索引中的不同对象。每个文档可以有不同的结构,但在实际部署中,将文件按类型区分对数据操作有很大帮助。
- 当然,需要记住一个限制,不同的文档类型不能为相同的属性设置不同的类型。例如,在同一索引中的所有文档类型中,一个叫title 的字段必须具有相同的类型。
5.4 映射(Mapping)
(1)映射的概念:
- 文档中的每个字段都必须根据不同类型做相应的分析。举例来说,对数值字段和从网页抓取的文本字段有不同的分析,比如前者的数字不应该按字母顺序排序,后者的第一步是忽略HTML标签,因为它们是无用的信息噪音。
- Elasticsearch在映射中存储有关字段的信息。每一个文档类型都有自己的映射,即使我们没有明确定义。
6. 分片&副本
(1)什么是 Shard (分片)?
- 一个 索引 可以存储超出单个结点硬件限制的大量数据。比如,一个具有 10亿文档的索引占据 1TB 的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。
- 为了解决这个问题,Elasticsearch 提供了将索引划分成多份的能力,这些份就叫做 分片。当你创建一个索引的时候,你可以指定你想要的 分片的数量。每个分片本身也是一个功能完善并且独立的 索引,这个 索引 可以被放置到集群中的任何节点上。
(2)分片之所以重要,主要有两方面的原因:
- 允许你水平分割/扩展你的内容容量。
- 允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量。
- 一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由 Elasticsearch 管理的,对于作为用户的你来说,这些都是透明的
(3)什么是 Replica (副本)?
- 副本是一个分片的精确复制,每个分片可以有零个或多个副本。副本的作用:
- 提高系统的容错性,当某个节点某个分片损坏或丢失时,可以从副本中恢复。
- 提高 ES 查询效率,ES 会自动对搜索请求进行负载均衡。
6.1 分片(Shards)
(1)分片概述:
- 索引可能存储大量可能超过单个节点硬件限制的数据。例如,占用1TB磁盘空间的十亿个文档的单个索引可能不适合单个节点的磁盘,或者可能太慢而无法单独从单个节点提供搜索请求。
- 为了解决这个问题,Elasticsearch提供了将索引细分为多个称为分片的功能。创建索引时,只需定义所需的分片数即可。每个分片本身都是一个功能齐全且独立的“索引”,可以托管在集群中的任何节点上。
(2)分片很重要,主要有两个原因:
- 它允许集群进行水平扩展;
- 它允许集群跨分片(可能在多个节点上)分布和并行化操作,从而提高性能和吞吐量。 分片的分布方式以及如何将其文档聚合回搜索请求的机制完全由Elastic Search管理,对用户而言是透明的。
(3)当有大量的文档时,由于内存的限制、硬盘能力、处理能力不足、无法足够快地响应客户端请求等,一个节点可能不够。在这种情况下,数据可以分为较小的称为分片 (shard)的部分(其中每个分片都是一个独立的Apache Lucene索引)。
- 每个分片可以放在不同的服务器上,因此,数据可以在集群的节点中传播。当你查询的索引分布在多个分片上时,Elasticsearch会把查询发送给每个相关的分片,并将结果合并在一起,而应用程序并不知道分片的存在。此外,多个分片可以加快索引。
- 在分布式系统中,单机无法存储规模巨大的数据,要依靠大规模集群处理和存储这些数据,一般通过增加机器数量来提高系统水平扩展能力。因此,需要将数据分成若干小块分配到各个机器上。然后通过某种路由策略找到某个数据块所在的位置。
6.2 副本(Replicas)
(1)副本概述:
- 为了提高查询吞吐量或实现高可用性,可以使用分片副本。副本 (replica)只是一个分片的精确复制,每个分片可以有零个或多个副本。换句话说,Elasticsearch可以有许多相同的分片,其中之一被自动选择去更改索引操作。这种特殊的分片称为主分片 (primary shard),其余称为副本分片 (replica shard)。在主分片丢失时,例如该分片数据所在服务器不可用,集群将副本提升为新的主分片。
- 除了将数据分片以提高水平扩展能力,分布式存储中还会把数据复制成多个副本,放置到不同的机器中,这样一来可以增加系统可用性,同时数据副本还可以使读操作并发执行,分担集群压力。但是多数据副本也带来了一致性的问题:部分副本写成功,部分副本写失败。
- 为了应对并发更新问题,ES将数据副本分为主从两部分,即主分片(primary shard)和副分片(replica shard)。主数据作为权威数据,写过程中先写主分片,成功后再写副分片,恢复阶段以主分片为准。
- 分片(shard)是底层的基本读写单元,分片的目的是分割巨大索引,让读写可以并行操作,由多台机器共同完成。读写请求最终落到某个分片上,分片可以独立执行读写工作。ES利用分片将数据分发到集群内各处。分片是数据的容器,文档保存在分片内,不会跨分片存储。分片又被分配到集群内的各个节点里。当集群规模扩大或缩小时,ES 会自动在各节点中迁移分片,使数据仍然均匀分布在集群里。
6.3 分析器
(1)分析器概述:
- 对于字符串类型的字段,可以指定Elastic search应该使用哪个分析器。使用分析器时,只需在指定字段的正确属性上设置它的名字,就这么简单。
- Elastic search允许我们使用众多默认定义的分析器中的一种。如下分析器可以开箱即用:
- standard :方便大多数欧洲语言的标准分析器。
- simple :这个分析器基于非字母字符来分离所提供的值,并将其转换为小写形式。
- whitespace :这个分析器基于空格字符来分离所提供的值。
- stop :这个分析器类似于simple 分析器,但除了simple 分析器的功能,它还能基于所提供的停用词(stop word)过滤数据。
- keyword :这是一个非常简单的分析器,只传入提供的值。你可以通过指定字段为not_analyzed 来达到相同的目的。
- pattern :这个分析器通过使用正则表达式灵活地分离文本。
- language :这个分析器旨在特定的语言环境下工作。
- snowball :这个分析器类似于standard 分析器,但提供了词干提取算法。
7. ES RESTful 操作
7.1 索引操作
7.1.1 创建索引
(1)语法如下:
// 创建索引 请求方式只能是PUT /user表示创建一个user索引
// settings表示这个索引的一些设置 number_of_shards表示分片数量
// number_of_replicas 表示每个分片的副本数量
PUT /user
{"settings": {"number_of_shards": 3,"number_of_replicas": 1}
}
(2)结果:
// acknowledged表示索引创建的回执信息,也就是响应的结果
// shards_acknowledged表示索引分片创建的回执信息
// index表示索引的名称
{"acknowledged" : true, "shards_acknowledged" : true,"index" : "user"
}
7.1.2 查看索引
(1)语法如下:
GET /user
(2)结果:
// user表示索引名称
// aliases表示索引的别名
// mappings表示索引中的字段
// settings表示索引的创建信息
{"user" : {"aliases" : { },"mappings" : { },"settings" : {"index" : {"creation_date" : "1667629798434","number_of_shards" : "3","number_of_replicas" : "1","uuid" : "VwShKX6-TliIeCIKttsRwA","version" : {"created" : "7060299"},"provided_name" : "user"}}}
}
7.1.3 删除索引
(1)语法如下:
DELETE /user
(2)结果:
{"acknowledged" : true
}
7.2 类型操作
7.2.1 创建类型
(1)语法如下:
// /user/_mappings表示设置user索引的具体数据结构,相当于定义类中的属性
// class User{ String name; String sex; int age; Date birthday;}
PUT /user/_mappings
{"properties": {"name": {"type": "text","analyzer": "ik_max_word","index": true,"store": false},"sex": {"type": "keyword"},"age": {"type": "integer"},"birthday": {"type": "date","format": "yyyy-MM-dd"}}
}
(2)结果:
{"acknowledged" : true,"shards_acknowledged" : true,"index" : "user"
}
7.2.2 查看类型
(1)语法如下:
GET /user
(2)结果:
{"user" : {"aliases" : { },"mappings" : {"properties" : {"age" : {"type" : "integer"},"birthday" : {"type" : "date","format" : "yyyy-MM-dd"},"name" : {"type" : "text","analyzer" : "ik_max_word"},"sex" : {"type" : "keyword"}}},"settings" : {"index" : {"creation_date" : "1667631425739","number_of_shards" : "5","number_of_replicas" : "1","uuid" : "hfhUHBKWQZukfeZLlteHKQ","version" : {"created" : "7060299"},"provided_name" : "user"}}}
}
7.3 文档操作
7.3.1 增加文档
(1)语法如下:
POST /user/_doc
{"name": "张三","sex": "男","age": 20,"birthday": "2000-05-06"
}
(2)结果:
{"_index" : "user","_type" : "_doc","_id" : "lfKkRoQB18W7DskkwOaq","_version" : 1,"result" : "created","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 0,"_primary_term" : 1
}
7.3.2 查看文档
(1)语法如下:
GET /user/_search
{"query": {"match_all": {}}
}
(2)结果:
{"took" : 1,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "user","_type" : "_doc","_id" : "lfKkRoQB18W7DskkwOaq","_score" : 1.0,"_source" : {"name" : "张三","sex" : "男","age" : 20,"birthday" : "2000-05-06"}}]}
}
7.3.3 修改文档
(1)语法如下:
// 修改语法: /索引/_doc/数据ID
// 这种修改需要注意,不是只修改一个属性,而是对整个文档进行修改,可以理解为是用一个新的文档去替换原来的文档完成修改。如果新的文档
// 只有1个属性,那么替换后的文档也只有1个属性。
PUT /user/_doc/lfKkRoQB18W7DskkwOaq
{"sex": "女"
}
(2)结果:
{"_index" : "user","_type" : "_doc","_id" : "lfKkRoQB18W7DskkwOaq","_version" : 3,"result" : "updated","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 2,"_primary_term" : 1
}
7.3.4 删除文档
(1)语法如下:
DELETE /user/_doc/lfKkRoQB18W7DskkwOaq
(2)结果:
{"_index" : "user","_type" : "_doc","_id" : "lfKkRoQB18W7DskkwOaq","_version" : 4,"result" : "deleted","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 3,"_primary_term" : 1
}
8. 倒排索引
(1)如下图所示:
- 将存放的数据,以一定的方式进行分词,并且将分词的内容存放到一个单独的分词库中。
- 当用户去查询数据时,会将用户的查询关键字进行分词。
- 然后去分词库中匹配内容,最终得到数据的id标识。
- 根据id标识去存放数据的位置拉取到指定的数据。
9. Elastic Search 总结
(1)ES 的框架图:
(2)核心概念:
(3)核心特性:
- 分布式架构:
- 数据自动分片(Sharding)和副本(Replication)。
- 支持水平扩展至上千节点,处理 PB 级数据。
- 实时搜索:
- 写入数据后 1 秒内 可被检索(近实时 NRT)。
- 全文搜索:
- 支持复杂查询:模糊匹配、短语搜索、同义词扩展等。
- 基于 TF-IDF 或 BM25 的相关性评分。
- 聚合分析:
- 支持统计、分组、直方图、地理分析等,如:
"aggs": { "avg_price": { "avg": { "field": "price" } } }
- RESTful API:
- 所有操作通过 HTTP API 完成,如:
GET /books/_search?q=title:elastic
(4)核心组件:
- Elastic Stack(ELK):
组件 | 作用 |
---|---|
Elasticsearch | 数据存储与检索 |
Logstash | 数据采集、转换、管道处理 |
Kibana | 数据可视化、仪表盘 |
Beats | 轻量级数据采集器(Filebeat, Metricbeat) |
- 分词器(Analyzer):
- 包含:字符过滤器 → 分词器 → 词单元过滤器。
- 内置分词器:standard、ik_smart(中文智能分词)。
(5)应用场景:
- 日志分析:结合 ELK Stack 实现实时日志收集、分析和告警。
- 全文搜索引擎:电商商品搜索、新闻内容检索。
- 实时监控:应用性能监控(APM)、基础设施指标分析。
- 推荐系统:基于用户行为的个性化推荐(结合协同过滤)。
- 地理空间分析:支持 geo_point 类型,实现附近地点搜索。
(6)Elasticsearch 的核心价值在于:
- 实时处理海量数据。
- 分布式扩展应对高并发。
- 全文搜索与复杂分析一体化。
- 强大的 ELK 生态集成。
相关文章:

技术栈ES的介绍和使用
目录 1. 全文搜索引擎(Elastic Search)的由来2. Elastic Search 概述2.1 Elastic Search 介绍2.2 Elastic Search 功能2.3 Elastic Search 特点 3. 安装 Elastic Search3.1 ES 的安装3.2 安装 kibana3.3 ES 客户端的安装 4. Elastic Search 基本概念4.1 …...
跟Gemini学做PPT-模板样式的下载
好的,这里有一些推荐的网站,您可以在上面找到PPT目录样式和模板的灵感: SlideModel (slidemodel.com) 提供各种预先设计的目录幻灯片模板。这些模板100%可编辑,可用于PowerPoint和Google Slides。您可以找到不同项目数量ÿ…...

Windows版本的postgres安装插件http
1、下载安装包 这里使用安装 pgsql-http 的扩展 源码地址:GitHub - pramsey/pgsql-http: HTTP client for PostgreSQL, retrieve a web page from inside the database. 编译的安装地址:http extension for windows updated to include PostgreSQL17 …...

uni-app学习笔记十六-vue3页面生命周期(三)
uni-app官方文档页面生命周期部分位于页面 | uni-app官网。 本篇再介绍2个生命周期 1.onUnload:用于监听页面卸载。 当页面被关闭时,即页面的缓存被清掉时触发加载onUnload函数。 例如:在demo6页面点击跳转到demo4,在demo4页面回退不了到d…...
优化的两极:凸优化与非凸优化的理论、应用与挑战
在机器学习、工程设计、经济决策等众多领域,优化问题无处不在。而在优化理论的世界里,凸优化与非凸优化如同两个截然不同的 “王国”,各自有着独特的规则、挑战和应用场景。今天,就让我们深入探索这两个优化领域的核心差异、算法特…...

(五)MMA(OpenTelemetry/Rabbit MQ/ApiGateway/MongoDB)
文章目录 项目地址一、OpenTelemetry1.1 配置OpenTelemetry1. 服务添加2. 添加服务标识3. 添加请求的标识4. 添加中间价 二、Rabbit MQ2.1 配置Rabbit MQ1. docker-compose2. 添加Rabbit MQ的Connect String 2.2 替换成Rabbit MQ1. 安装所需要的包2. 使用 三、API Gateways3.1 …...

TCP通信与MQTT协议的关系
1. MQTT 处理核心(Mqtt_Pro) void Mqtt_Pro(void) { MQTT_Init(); // 初始化MQTT协议栈(连接参数、缓冲区等) MQTT_SendPro(); // 处理MQTT发送(封装消息,调用TCP发送) MQTT_RecPro();…...
AWS创建github相关的角色
创建github-actions角色 {"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": {"Federated": "arn:aws:iam::11111111:oidc-provider/token.actions.githubusercontent.com…...
数据编辑器所具备的数据整理功能
在企业的数据处理过程中,数据清洗与整理是至关重要的环节,而数据编辑器在这方面发挥着关键作用。在一份包含客户信息的数据表中,常常会出现缺失值的情况。比如客户的年龄、联系方式等字段可能因为各种原因没有被记录,这就形成了缺…...
Unity网络开发实践项目
摘要:该网络通信系统基于Unity实现,包含以下几个核心模块: 协议配置:通过XML定义枚举(如玩家/英雄类型)、数据结构(如PlayerData)及消息协议(如PlayerMsg)&a…...

Jetson Orin Nano - SONY imx415 camera驱动开发
目录 前言: 调试准备工作: 修改内核默认打印等级 一、imx415驱动开发 1、硬件接线 2、设备树修改 2.1 创建 tegra234-p3767-camera-p3768-imx415-C-4lane.dtsi 文件 2.2 tegra234-p3767-camera-p3768-imx415-C-4lane.dtsi 添加到设备树 2.3 编译设备树 3、imx415驱动…...

word为跨页表格新加表头和表名
问题: 当表格过长需要跨页时(如下图所示),某些格式要求需要转页接排加续表。 方法一: 1、选中表格,在“表布局”区域点开“自动调整”,选择“固定列宽”(防止后续拆分表格后表格变…...

测试用例篇章
本节概要: 测试⽤例的概念 设计测试⽤例的万能思路 设计测试⽤例的⽅法 一、测试用例 1.1 概念 什么是测试用例? 测试⽤例(Test Case)是为了实施测试⽽向被测试的系统提供的⼀组集合,这组集合包含:测…...

2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛复赛CTF部分WP-哥斯拉流量分析
2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛复赛CTF部分WP-哥斯拉流量分析 一、流量分析 题目没有任何提示,附件gzl.pcap 解题哥斯拉流量300多KB包很多,没啥经验只能挨个看回来之后又狠狠得撸了一把哥斯拉流量分析我这里用的是哥斯拉4.0.1 测试链接…...

Django ToDoWeb 服务
我们的任务是使用 Django 创建一个简单的 ToDo 应用程序,允许用户添加、查看和删除笔记。我们将通过设置 Django 项目、创建 Todo 模型、设计表单和视图来处理用户输入以及创建模板来显示任务来构建它。我们将逐步实现核心功能以有效地管理 todo 项。 Django ToDoWeb 服务 …...
【软件】在 macOS 上安装 Postman
在 macOS 上安装 Postman 是一个简单的过程,以下是详细的步骤: 一、下载 Postman • 访问 Postman 官方网站: 打开浏览器,访问Postman 官方下载页面。 • 下载安装包: 页面会自动识别你的系统,点击“Dow…...

各种数据库,行式、列式、文档型、KV、时序、向量、图究竟怎么选?
慕然回首,发现这些年来涌现出了许多类型的数据库,今天抽空简单回顾一下,以便于后面用到时能快速选择。 1. 关系型数据库(行式) 关系型数据库(RDBMS),我们常说的数据库就是指的关系型数据库。 它的全称是关…...

全志科技携飞凌嵌入式T527核心板亮相OpenHarmony开发者大会
近日,OpenHarmony开发者大会2025(OHDC.2025,以下简称“大会”)在深圳举办,全志科技作为OpenHarmony生态的重要合作伙伴受邀参会,并进行了《全志科技行业智能芯片OpenHarmony方案适配与认证经验分享》的主题…...
AI+微信小程序:智能客服、个性化推荐等场景的落地实践
在移动互联网流量红利逐渐见顶的今天,微信小程序凭借“即用即走”的轻量化特性,已成为企业连接用户的核心阵地。而AI技术的融入,正让小程序从工具型应用进化为“懂用户、会思考”的智能服务终端。本文将结合实际案例,解析AI在微信小程序中的两大核心场景——智能客服与个性…...

事件驱动架构入门
主要参考资料: 软件架构-事件驱动架构: https://blog.csdn.net/liuxinghao/article/details/113923639 目录 简介事件队列事件日志事件收集器响应队列读事件 vs. 写事件 简介 事件驱动架构是一种系统或组件之间通过发送事件和响应事件彼此交互的架构风格。当某个事…...

基于Web的濒危野生动物保护信息管理系统设计(源码+定制+开发)濒危野生动物监测与保护平台开发 面向公众参与的野生动物保护与预警信息系统
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...
索引的选择与Change Buffer
1. 索引选择与Change Buffer 问题引出:普通索引 vs 唯一索引 ——如何选择? 在实际业务中,如果一个字段的值天然具有唯一性(如身份证号),并且业务代码已确保无重复写入,那就存在两种选择&…...

leetcode hot100刷题日记——30.两数之和
解答: 方法一:迭代 迭代大致过程就是: 算两条链表的当前位的和,加上上一位留下来的进位,就是新链表的当前位的数字。计算当前的进位。 这样,我们迭代需要的东西是:链表1,链表2&…...

Fastapi 学习使用
Fastapi 学习使用 Fastapi 可以用来快速搭建 Web 应用来进行接口的搭建。 参考文章:https://blog.csdn.net/liudadaxuexi/article/details/141062582 参考文章:https://blog.csdn.net/jcgeneral/article/details/146505880 参考文章:http…...
Ollama:本地大模型推理与应用的创新平台
引言 随着大语言模型(LLM)和生成式AI的快速发展,越来越多的开发者和企业希望在本地或私有环境中运行AI模型,以满足数据隐私、安全、低延迟和定制化的需求。Ollama 正是在这一背景下诞生的创新平台。它让大模型的本地部署、推理和集成变得前所未有的简单和高效。本文将系统…...

rtpinsertsound:语音注入攻击!全参数详细教程!Kali Linux教程!
简介 2006年8月至9月期间,我们创建了一个用于将音频插入指定音频(即RTP)流的工具。该工具名为rtpinsertsound。 该工具已在Linux Red Hat Fedora Core 4平台(奔腾IV,2.5 GHz)上进行了测试,但预…...
django项目开启debug页面操作有数据操作记录
在项目的主文件中setting中配置 """ Django settings for ProjectPrictice project.Generated by django-admin startproject using Django 3.0.1.For more information on this file, see https://docs.djangoproject.com/en/3.0/topics/settings/For the ful…...
【Vim】高效编辑技巧全解析
本篇将从光标移动技巧、常用快捷操作、组合命令运用等方面逐步讲解 vim 的使用。 📘 高效光标移动技巧 在 Vim 中,光标移动是编辑效率的核心之一。以下是一些必须掌握的移动命令,按使用频率和实用程度分类整理: 🔹 基…...
基于 Node.js 的 Express 服务是什么?
Express 是基于 Node.js 的一个轻量级、灵活的 Web 应用框架,用于快速构建 HTTP 服务(如网站、API 接口等),以下是详细解析: 一、Express 的核心作用 简化 Node.js 原生开发 Node.js 原生 http 模块虽…...

【C++】入门基础知识(1.5w字详解)
本篇博客给大家带来的是一些C基础知识!包含函数栈帧的详解! 🐟🐟文章专栏:C 🚀🚀若有问题评论区下讨论,我会及时回答 ❤❤欢迎大家点赞、收藏、分享! 今日思想࿱…...