ElastricSearch 原理以及简单实用(超级通俗)

提到非结构化数据的检索,常常用到 ElasticSearch,他是什么呢?

ElasticSearch 是一个基于 Apache Lucene 的分布式搜索引擎,可以作为实时文档存储系统,且文档的每一个内容都可以被检索,能够处理 PB 级别的结构化和非结构化数据。

ElasticSearch 本身具有分布式特性的特点。

Apache Lucene

  1. 背景

    Lucene 是为了解决大规模文本数据的高效检索问题而设计的。90 年代末,互联网的内容量飞速增加,企业的大量文本数据难以快速检索。虽然传统数据库可以处理这些数据,但是“全文检索”的支持有限,尤其是在复杂搜索(模糊匹配、词组查询、相关性排序)时效率低下。

    99 年 Lucene 作为一个开源的全文检索库而问世,专门应对上述问题。Lucene 通过倒排索引结构,极大的提升了文本搜索的速度;并且内置了查询功能和打分机制,可以按相关性排序。

    Lucene 的诞生是为了填补大规模文本数据快速、灵活检索的空缺。他在几十年后成为了搜索基础的基础,如分布式搜索引擎 ElasticSearch

  2. 优点:

    1. 倒排索引 → 高性能
    2. 布尔查询、模糊查询、词组查询 → 复杂信息检索
    3. 打分排序 → 相关性计算
  3. 缺点

    1. 使用复杂、缺乏分布式支持

1.名词解释

在这里插入图片描述
在这里插入图片描述

  1. 索引(Index) → 关系数据库中的 数据库

    索引指的是包含一堆具有相似结构的文档数据 (Document)

    如:商品索引、订单索引。在商品索引中,可以存放成千上万的商品信息;

  2. 类型(Type) → 关系数据库中的
    (貌似 es 6.0 之后就不支持了,去除这个概念了)

    类型是索引内部的逻辑分区(category/partition),每个 Index 里都可以有一个或多个 type,type 是 Index 中的一个逻辑数据分类,一个 type 下的 document 有相同的 field。

    如:商品索引中,服务和旅游路线,虽然都是可售卖的商品,但因为有很多属性不同,所以定义了两种 type;此外还可以为类目定义一个Type

    服装商品的Type:商品名字、价格、描述

    旅游路线商品的Type:商品名字、价格、描述、行程信息

  3. 文档&属性(Document&Field) → 关系数据库中的 一行记录字段

    一个 document 是一条实例数据

    例如一个商品,一个订单,通常使用 JSON 数据格式表示。一个 document 里面有多个 field,每个 field 就是一个数据字段。

    {
        _Index: "twitter",
        _type: "_doc",
        _id: "1",
        _version: 1,
        _seq_no: 0,
        _primary_term: 1,
        found: true,
        _source: {
            user: "kimchy",
            post_date: "2009-11-15T13:12:00",
            message: "Trying out Elasticsearch, so far so good?"
        }
    }
    
  4. 词条(Term)

    索引里最小的存储和查询单元。

    对于英文来说是一个单词,对于中文来说一般指分词后的一个词。

  5. 词典(Term Dictionary)

    即字典,是词条 term 的集合

    搜索引擎通常的索引单位是单词单词词典由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针

  6. 正排数据

    搜索引擎的通用叫法,即原始数据,可以理解为一个 doc list

  7. 倒排数据

    lucenne 索引的通用叫法,即实现了 term 到 doc list 的映射

    倒排索引建立的是 分词(Term) 和 文档(Document) 之间的映射关系,在倒排索引中,数据是面向词(term) 而不是 面向文档的。

  8. 倒排表(Post list)

    一个文档通常由多个词组成,倒排表记录的是某个词在那些文档里出现过以及出现的位置

    每条记录称为一个倒排项(Posting)

    倒排表记录的不单是文档编号,还存储了词频等信息

  9. 倒排文件(Inverted File)

    所有单词的倒排列表往往顺序的存储在磁盘的某个文件里,这个文件称之为倒排文件,倒排文件是存储倒排索引的物理文件

2.索引原理

2.1倒排索引的结构

原始文档如下

Doc1: I love China。
Doc2: I love work。
Doc3: I love coding。

为了创建倒排索引,

  • 首先通过分词器将每个文档的内容域拆分成单独的词(Term),
  • 创建一个包含所有不重复词条的排序列表,
  • 然后列出每个词条出现在哪个文档。

如下

TermDoc1Doc2Doc3
IYYY
ChinaY
codingY
loveYYY
workY

这种结构由文档中所有不重复的列表构成,对于其中每个词都有一个 Doc 与之关联

这种由属性值来确定记录的位置的结构就是倒排索引(Post Index)

带有倒排索引的文件称之为倒排文件(Inverted file)

在这里插入图片描述

2.2 搜索

下面举例说明倒排索引如何高效

  1. 创建倒排索引

    假设有一张学生成绩表

    idnamegenderscore
    1Fernfemale80
    2Alicefemale70
    3Bunnymale90
    4Aimeefemale70
    5Amyfemale80
    6tracyfemale90

    数据存到 ES 后,会建立以下倒排索引:

    Name

    TermPosting List
    Aimee4
    Alice2
    Amy5
    Bunny3
    Fern1
    tracy6

    Gender

    TermPosting List
    female[1,2,4,5,6]
    male3

    Score

    TermPosting List
    70[2,4]
    80[1,5]
    90[3,6]

    以上为词条和倒排索引的关系,即当搜索 score=70 的时候,通过倒排索引能直接找到 [2,4] 记录,然后返回对应的记录。

  2. 词典

    词典是词条的集合,当词条很多的时候,ES 如何高效查询呢?

    在 Mysql 数据库中也有类似问题,当记录很多的时候,Mysql 的做法是创建索引,Mysql 的索引是使用 B+ 树实现的,如果查询条件能用上索引那么就可以直接将查询条件 和索引进行匹配,因为索引是 B+ 树,所以查询效率也非常高。

    ES 的做法也类似,即对上述词条排序,然后通过二分查找法将时间复杂度降到 l o g N logN logN

    假设 name 取值如下:

    Fern, Alice, Bunny, Aimee, Amy, tracy

    排序后

    Aimee, Alice, Amy, Bunny, Fern, tracy

    Mysql 的索引存储在磁盘上,ES 的词典存储在内存中,按照上面的做法,ES 虽然可以解决查询效率问题,但是他会引起另一个问题:当 Term (词条) 很多时,内存必定无法容纳这些词条,那 ES 时如何处理这个问题的呢?

    ES 的做法是创建 Term Index

    上面的 Term 都是英文字母,但实际情况是,term 可以任意的 byte 数组;另外,很多时候 term 数量对应的内容未必均衡,如图所示:C 字符开头的 term 一个没有,而 A 开头的 term 特别多。Lucene 内部的 Term Index 用的是变种 trie 树即 FST(finite-state transducer),trie 树只共享了前缀,而 FST 既共享前缀也共享后缀,更节省空间。

    关于 FST 的原理比较复杂,这里了解他在这里的核心作用高效的查找到词条(Term)

    通过 Term Index 可以快速定位到 Term Dictionary 的某个 offset然后从这个位置在往后顺序查找

    再加上一些压缩技术(搜索 FST),Term Index 的尺寸可以只有 所有 Term 的尺寸的几十分之一使得内存缓存整个 Term Index 变成了可能

    在这里插入图片描述

    如图所示,Term Index 主要解决的是快速定位到 Term,和现实中的字典或通讯录比较类似,例如,可以直接通过字母 W 快速找到 W 开头的姓氏。

3.教程

  1. linux上安装

    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.15.3-linux-x86_64.tar.gz
    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.15.3-linux-x86_64.tar.gz.sha512
    shasum -a 512 -c elasticsearch-8.15.3-linux-x86_64.tar.gz.sha512 
    tar -xzf elasticsearch-8.15.3-linux-x86_64.tar.gz
    cd elasticsearch-8.15.3/ 
    
  2. MaxOS 上安装

    curl -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.15.3-darwin-x86_64.tar.gz
    curl https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.15.3-darwin-x86_64.tar.gz.sha512 | shasum -a 512 -c - 
    tar -xzf elasticsearch-8.15.3-darwin-x86_64.tar.gz
    cd elasticsearch-8.15.3/ 
    

3.运行 ElasticSearch 在命令行

./bin/elasticsearch
  • 这里一定要注意密码

首次启动 Elasticsearch 时,默认情况下会启用并配置安全功能。以下安全配置会自动发生:

  • 启用认证和授权,并为 elastic 内置超级用户生成密码。
  • 为传输层和 HTTP 层生成 TLS 的证书和密钥,并使用这些密钥和证书启用和配置 TLS。
  • 为 Kibana 生成注册令牌,有效期为 30 分钟。

Elastic 用户的密码和 Kibana 的注册令牌将输出到您的终端。

我们建议将 elastic 密码存储为 shell 中的环境变量。例如:

export ELASTIC_PASSWORD="your_password"
  1. 检查 Elasticsearch 是否运行

    curl --cacert $ES_HOME/config/certs/http_ca.crt -u elastic:$ELASTIC_PASSWORD https://localhost:9200 
    

转载自阿里云:https://developer.aliyun.com/article/775303

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

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

相关文章

在线培训知识库:企业培训的新篇章

在当今快节奏的商业环境中,员工培训已成为企业保持竞争力的关键。在线培训知识库作为一种新兴的培训工具,正逐渐成为企业培训体系的核心。它不仅能够提供灵活的学习方式,还能确保培训内容的及时更新和高效传播。本文将探讨在线培训知识库的重…

简单的kafkaredis学习之kafka

简单的kafka&redis学习整理之kafka 1. kafka 1.1 什么是消息队列 在学习Kafka之前我们先来看一下什么是消息队列,消息队列(Message Queue):可以简称为MQ 例如:Java中的Queue队列,也可以认为是一个消息队列 消息队列&#x…

【连续多届检索,ACM出版】第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024,11月15-17)--冬季主会场

第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024)--冬季主会场 2024 4th International Conference on Big Data, Artificial Intelligence and Risk Management 会议官网:www.icbar.net 2024 4th International Conference on Big Data, Artificial I…

集成框架 -- 自定义二方包 starter

自定义starter 二方包 My-thread-pool-startermy-thread-pool-starter 整体架构 测试 MyTestAppApplication测试工程 my-test-app 结构测试项目的 pom.xml 二方包 My-thread-pool-starter POM 文件 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&…

如何看待AI技术的应用前景?

文章目录 如何看待AI技术的应用前景引言AI技术的现状1. AI的定义与分类2. 当前AI技术的应用领域 AI技术的应用前景1. 经济效益2. 社会影响3. 技术进步 AI技术应用面临的挑战1. 数据隐私与安全2. 可解释性与信任3. 技能短缺与就业影响 AI技术的未来发展方向1. 人工智能的伦理与法…

华为擎云(银河麒麟V10+麒麟9000C CPU)电脑总是弹出“选择新密钥环的密码”(20241030)

症状如下图&#xff1a; 网络上一般的解决方法都是安装 seahorse &#xff0c;例如这篇文章:银河麒麟系统清除桌面密钥环 不知道为什么&#xff0c;这对我的这台电脑并不可行。 麒麟系统用的是 Gnome 桌面。这个“密钥环”的弹出框是由 gnome-keyring-daemon 弹出的。这是一个…

[SICTF Round4] PWN

这PWN题似乎是给我出的&#xff0c;4个一血1个2血。密码又过于简单。逆向太难了又不大会。 Stack fengshui main可以溢出覆盖rbpret所以它每一步都需要移栈。 可用的ROP里没有pop rdi,在4004c0里有错位的01 5d c3 &#xff1a;add DWORD PTR [rbp-0x3d], ebx 并且有对应的p…

yaml文件编写

Kubernetes 支持YAML和JSON格式管理资源 JSON 格式:主要用于 api 接口之间消息的传递 YAML 格式;用于配置和管理,YAML是一种简洁的非标记性语言,内容格式人性化容易读懂 一&#xff0c;yaml语法格式 1.1 基本语法规则 使用空格进行缩进&#xff08;不使用制表符&#xff0…

2025浙江省考报名流程详细教程

2025年浙江省考报名马上就要开始了&#xff0c;有想要参加浙江省考的同学&#xff0c;可以提前看一下报名流程&#xff0c;和报名照要求。 报名时间&#xff1a;11月6日9时一11月11日17时 南核时间&#xff1a;11月6日9时一11月13日17时 缴费时间&#xff1a;11月14日9时一11月…

江协科技STM32学习- P30 FlyMCU串口下载STLink Utility

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

HarmonyOS鸿蒙开发入门,常用ArkUI组件学习(一)

刚开始接触HarmonyOS的开发&#xff0c;希望不会太晚。在我学习的过程中&#xff0c;我会将我学到的内容&#xff0c;通过写博客的形式&#xff0c;来进行回忆和复习。同时也希望能够遇到志同道合的朋友&#xff0c;我们一起学习&#xff0c;一起进步&#xff0c;文章中有什么不…

shell脚本案例:创建用户和组

使用场景 在部署程序时&#xff0c;往往首要任务是创建用户和组。有的程序可能用到的组、用户比较多&#xff1b;且不知道服务器环境是否已经有了所需的组和用户。所以针对这个情况&#xff0c;根据Oracle RAC部署时的实际情况写了个脚本。 Linux版本 脚本代码 #!/bin/bash …

【设计模式】结构型模式(一):适配器模式、装饰器模式

结构型模式&#xff08;一&#xff09;&#xff1a;适配器模式、装饰器模式 1.适配器模式&#xff08;Adapter&#xff09;2.装饰器模式&#xff08;Decorator&#xff09;2.1 主要特点2.2 组成部分2.3 示例代码2.3.1 Component 组件2.3.2 ConcreteComponent 具体组件2.3.3 Dec…

交换机的基本配置

交换机的基本配置 实验题目实验目的实验任务实验设备实验环境实验步骤VLAN 的简单配置跨交换机 vlan 的配置主机配置信息表解释&#xff1a; vlan 间路由 实验题目 交换机的基本配置。 实验目的 1) 理解交换机的原理和应用场景&#xff1b; 2) 交换机的基本指令系统&#xf…

QFrameWork学习指南

QFramework官网地址&#xff1a;Wiki - 木兰确实 1、界面设计 &#xff08;1&#xff09;CounterAppController的界面 BtnAdd和BtnSub为Button组件&#xff0c;CountText为Text组件&#xff0c;后续的脚本挂载Canvas上。 &#xff08;2&#xff09;OnGUI OnGUI是Unity中通过…

黄金价格下跌,原油价格激增,小麦价格面临阻力

黄金价格回落 现货黄金价格达到每金衡盎司 $2,790.00 的新纪录高点&#xff0c;接近心理关口 $2,800.00&#xff0c;随后在部分交易员在周五美国非农就业数据&#xff08;NFPs&#xff09;公布前以及下周美国选举前套现利润的回撤中下跌至 $2,732.00。 在 $2,732.00 以下是 10…

DiskGenius一键修复磁盘损坏

下午外接磁盘和U盘都出现扇区损坏&#xff0c;估计就是在开着电脑&#xff0c;可能是电脑运行的软件还在对磁盘进行读写&#xff0c;不小心按到笔记本关机键&#xff0c;重新开机读写磁盘分区变得异常卡顿&#xff0c;估摸就是这个原因导致扇区损坏。在进行读写时&#xff0c;整…

智慧国土空间规划方法探索与实践应用

在数字化时代背景下&#xff0c;国土空间规划正经历着一场深刻的变革。智慧国土空间规划作为一种新兴的规划理念和方法&#xff0c;其核心在于利用现代信息技术&#xff0c;提高规划的科学性、精准性和动态适应性。本文将探讨智慧国土空间规划的方法探索与实践应用。 1. 智慧国…

从零开发操作系统-为什么磁盘的扇区为 512 byte

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

一文了解Android SELinux

在Android系统中&#xff0c;SELinux&#xff08;Security-Enhanced Linux&#xff09;是一个增强的安全机制&#xff0c;用于对系统进行强制访问控制&#xff08;Mandatory Access Control&#xff0c;MAC&#xff09;。它限制了应用程序和进程的访问权限&#xff0c;提供了更…