第一章:ElasticSearch简介

news2024/11/15 17:31:44

Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;

本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。

es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

1.1 ElasticSearch的使用案例

  • 2013年初,GitHub抛弃了Solr,采取ElasticSearch 来做PB级的搜索。 “GitHub使用ElasticSearch搜索20TB的数据,包括13亿文件和1300亿行代码”
  • 维基百科:启动以elasticsearch为基础的核心搜索架构
  • SoundCloud:“SoundCloud使用ElasticSearch为1.8亿用户提供即时而精准的音乐搜索服务”
  • 百度:百度目前广泛使用ElasticSearch作为文本数据分析,采集百度所有服务器上的各类指标数据及用户自定义数据,通过对各种数据进行多维分析展示,辅助定位分析实例异常或业务层面异常。目前覆盖百度内部20多个业务线(包括casio、云分析、网盟、预测、文库、直达号、钱包、风控等),单集群最大100台机器,200个ES节点,每天导入30TB+数据
  • 新浪使用ES 分析处理32亿条实时日志
  • 阿里使用ES 构建挖财自己的日志采集和分析体系

1.2 Lucene

在介绍Lucene之前,我们先了解一下我们日常遇到的数据类型

搜索引擎是对数据的检索,所以我们先从生活中的数据说起。我们生活中的数据总体分为两种:

  • 结构化数据
  • 非结构化数据

结构化数据:也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。指具有固定格式或有限长度的数据,如数据库,元数据等。

非结构化数据:又可称为全文数据,不定长或无固定格式,不适于由数据库二维表来表现,包括所有格式的办公文档、XML、HTML、Word 文档,邮件,各类报表、图片和咅频、视频信息等。

说明:如果要更细致的区分的话,XML、HTML 可划分为半结构化数据。因为它们也具有自己特定的标签格式,所以既可以根据需要按结构化数据来处理,也可抽取出纯文本按非结构化数据来处理。

根据两种数据分类,搜索也相应的分为两种:

  • 结构化数据搜索
  • 非结构化数据搜索

对于结构化数据,因为它们具有特定的结构,所以我们一般都是可以通过关系型数据库(MySQL,Oracle 等)的二维表(Table)的方式存储和搜索,也可以建立索引。

对于非结构化数据,也即对全文数据的搜索主要有两种方法:

  • 顺序扫描
  • 全文检索

顺序扫描:通过文字名称也可了解到它的大概搜索方式,即按照顺序扫描的方式查询特定的关键字。

例如给你一张报纸,让你找到该报纸中“平安”的文字在哪些地方出现过。你肯定需要从头到尾把报纸阅读扫描一遍然后标记出关键字在哪些版块出现过以及它的出现位置。

这种方式无疑是最耗时的最低效的,如果报纸排版字体小,而且版块较多甚至有多份报纸,等你扫描完你的眼睛也差不多了。

全文搜索:对非结构化数据顺序扫描很慢,我们是否可以进行优化?把我们的非结构化数据想办法弄得有一定结构不就行了吗?

将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。

这种方式就构成了全文检索的基本思路。

这部分从非结构化数据中提取出的然后重新组织的信息,我们称之为索引。

这种方式的主要工作量在前期索引的创建,但是对于后期搜索却是快速高效的。

通过对生活中数据的类型作了一个简短了解之后,我们知道关系型数据库的 SQL 检索是处理不了这种非结构化数据的。

这种非结构化数据的处理需要依赖全文搜索,而目前市场上开放源代码的最好全文检索引擎工具包就属于 Apache 的 Lucene了。

但是 Lucene 只是一个工具包,它不是一个完整的全文检索引擎。

Lucene 的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。

目前以 Lucene 为基础建立的开源可用全文搜索引擎主要是 SolrElasticsearch

Solr 和 Elasticsearch 都是比较成熟的全文搜索引擎,能完成的功能和性能也基本一样。

但是 ES 本身就具有分布式的特性和易安装使用的特点,而 Solr 的分布式需要借助第三方来实现,例如通过使用 ZooKeeper 来达到分布式协调管理。

ElasticSearch与solr的对比

  • Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;
  • Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式;
  • Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供;
  • Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch

不管是 Solr 还是 Elasticsearch 底层都是依赖于 Lucene,而 Lucene 能实现全文搜索主要是因为它实现了倒排索引的查询结构

1.3 如何理解倒排索引?

假如现有三份数据文档,文档的内容如下分别是:

  • Java is the best programming language.
  • PHP is the best programming language.
  • Javascript is the best programming language.

为了创建倒排索引,我们通过分词器将每个文档的内容域拆分成单独的词(我们称它为词条Term),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。

结果如下所示:
在这里插入图片描述

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

这种由属性值来确定记录的位置的结构就是倒排索引。带有倒排索引的文件我们称为倒排文件。

我们将上面的内容转换为图的形式来说明倒排索引的结构信息,如下图所示:

在这里插入图片描述

其中主要有如下几个核心术语需要理解:

  • 词条(Term):索引里面最小的存储和查询单元,对于英文来说是一个单词,对于中文来说一般指分词后的一个词。
  • 词典(Term Dictionary):或字典,是词条 Term 的集合。搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。
  • 倒排表(Post list):一个文档通常由多个词组成,倒排表记录的是某个词在哪些文档里出现过以及出现的位置。

每条记录称为一个倒排项(Posting)。倒排表记录的不单是文档编号,还存储了词频等信息。

  • 倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件被称之为倒排文件,倒排文件是存储倒排索引的物理文件。

从上图我们可以了解到倒排索引主要由两个部分组成:

  • 词典
  • 倒排文件

词典和倒排表是 Lucene 中很重要的两种数据结构,是实现快速检索的重要基石。

词典和倒排文件是分两部分存储的

  • 词典在内存中
  • 倒排文件存储在磁盘上。

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

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

相关文章

MFC|各控件的使用

参考: MFC学习笔记-4-选项控件Combox的使用(https://dandelioncloud.cn/article/details/1517727978783109122) 文章目录控件与变量关联各控件的使用Combo Box添加设置默认选项插入 index从0开始删除获取1号索引的具体内容添加事件获取当前in…

前端学习--async

文章目录async函数await使用await等待Promise异步函数await等待普通函数什么时候使用async/awaitasync也是用于异步任务的,可以说是异步任务处理的另一种方式async函数 async修饰函数,表示这个函数中可以处理异步函数 async修饰的函数,会返…

每天10个前端小知识 【Day 3】

前端面试基础知识题 1. 使用js生成1-10000的数组 实现的方法很多,除了使用循环(for,while,forEach等)外,最简单的是使用Array.from //方法一: Array.from(new Array(10001).keys()).slice(1) //方法二:…

基于paddlex图像分类模型训练(二):训练自己的分类模型、熟悉官方demo

0. 前言 相关系列博文:基于paddlex图像分类模型训练(一):图像分类数据集切分:文件夹转化为imagenet训练格式 代码在线运行: https://aistudio.baidu.com/aistudio/projectdetail/5440569 1. 官方demo&a…

spring框架之注解开发

Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势。 让我们来看看注解开发之前是如何定义bean的? ① BrandDemo.java ② applicationContext.xml ③Test.java 一、注解开发定义bean 组件扫描 二…

信用卡APP评测系列——工银e生活5.0打造个人生活服务平台,引领用户美好生活

易观:中国信用卡市场规模增速趋稳,线上成为存量用户经营主阵地, APP用户高质量经营成为新发力点,也是业务良性增长保障,对此,银行机构着力用户体验竞相升级信用卡APP。工商银行顺势升级工银e生活APP5.0版&a…

第二章.神经网络—3层神经网络的实现,输出层设计

第二章.神经网络 2.3 三层神经网络的实现 1.各层间信号传递的实现 1).示意图: 2).公式: ①.用数学式表示a1(1): ②.用矩阵表示第一层的加权和: 3).实现: import numpy as np# 3层神经网络的实现# 参数初始化 def i…

华数杯B题——校任务尝试

一、背景说明 根据影响社会稳定的因素,以及颜色革命,来衡量社会稳定性,判断社会风险 社会预警指标体系是由一系列经过理论遴选的敏感指标组成的一种测量社会危机现象及其运行过程的指标系统,它作为一种特定的测量工具和手段&…

Java设计模式--原型模式

概念:用原型实例(最初的)指定创建对象的种类,并且通过拷贝这些原型,创建新的对象。(自我复制能力)1.类图原理类图分析Prototype:原型类,声明一个克隆自己的接口ConcreteP…

Go编程规范和性能调优(三)——规范编码和性能优化

文章目录一、本次学习重点内容:二、详细知识点介绍:1、高质量编程简介什么是高质量?编程原则:2、编码规范注释:代码格式:命名规范变量:函数:package:错误和异常处理&…

关于yolov8的训练的一些改动

1、YOLOv8创新改进点: 1.1.Backbone 使用的依旧是CSP的思想,不过YOLOv5中的C3模块被替换成了C2f模块,实现了进一步的轻量化,同时YOLOv8依旧使用了YOLOv5等架构中使用的SPPF模块; 1.2.PAN-FPN 毫无疑问YOLOv8依旧使…

大文件传输软件的优势有哪些?-镭速传输

互联网时代,大数据传输是企业面临的必不可免的问题,可以选择传统的FTP、网盘等方式来传输,对于小型文件或许是有优势的;但是对于大型文件数据的话,也许会出现传输速度慢,数据不可靠的情况,极大的…

python3+requests+unittest:接口自动化测试(一)

简单介绍框架的实现逻辑,参考代码的git地址: GitHub - zhangying123456/python_unittest_interface: pythonunittest接口自动化测试脚本 1.环境准备 python3 pycharm编辑器 2.框架目录展示 (该套代码只是简单入门,有兴趣的可…

Nginx——Keepalived的原理与配置

摘要 Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除, 同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keep…

python求解带约束的优化问题

带约束的优化问题可被定义为: 在python中,可以使用scipy的optimize包进行求解,具体求解函数为linprog,下面举例说明求解方法: 假设问题被定义为: 首先,求解最大值问题,我们可以通…

Spring Security 源码解读 :认证总览

Spring Security 提供如下几种认证机制: Username & PasswordOAuth2.0 LoginSAML 2.0 LoginRemember MeJAAS AuthenticationPre-authentication ScenariosX509 Authentication 这里使用Spring Boot 2.7.4版本,对应Spring Security 5.7.3版本 Serv…

LeetCode题目笔记——1588. 所有奇数长度子数组的和

文章目录题目描述题目难度——简单方法一:暴力代码/C代码/Python方法二:前缀和代码/C代码/Python总结题目描述 给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。 子数组 定义为原数组中的一个连续子序列。 请你返回 arr 中…

MySql性能优化(六)索引监控

文章目录索引监控Handler_read_firstHandler_read_keyHandler_read_lastHandler_read_nextHandler_read_prevHandler_read_rndHandler_read_rnd_next索引监控 SHOW STATUS LIKE Handler_read%解释一下各个参数的含义 Handler_read_first 通过index获取数据的次数 Handler_r…

在cmd中遍历局域网内的IP命令解析

简单的方法 1,直接通过浏览器访问路由器,通过路由器的页面查看。2,网络中很多扫描网络的软件,3,自己使用cmd命令查看 有时候自己也觉得,有简单的方式还用这麻烦的干嘛。但遇到不知道路由的登录密码呢&…

Djiango零基础-快速了解基本框架笔记-附案例

初识Djiango 1. 安装djiango pip install django4.1 -i https://mirrors.aliyun.com/pypi/simple/C:\python38- python.exe- Scripts- pip.exe- djiango-admin.exe 【工具,创建djiango项目】- Lib- 内置模块- site-packages- openpyxl- python-docx- flask- djia…