网站建设的报告分析,电商平面设计岗位职责,做美容美容院网站的费用,镇江网站建设个ElasticSearch
版本#xff1a;7.8 学习视频#xff1a;尚硅谷 笔记#xff1a;https://zgtsky.top/
ElasticSearch介绍
Elaticsearch#xff0c;简称为es#xff0c; es是一个开源的高扩展的分布式全文检索引擎#xff0c;它可以近乎实时的存储、检索数据#xff1b…ElasticSearch
版本7.8 学习视频尚硅谷 笔记https://zgtsky.top/
ElasticSearch介绍
Elaticsearch简称为es es是一个开源的高扩展的分布式全文检索引擎它可以近乎实时的存储、检索数据本身扩展性很好可以扩展到上百台服务器处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性从而让全文搜索变得简单。
ElasticSearch的官方地址 https://www.elastic.co/products/elasticsearch
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 构建挖财自己的日志采集和分析体系
相关知识
全文检索 数据分类 我们生活中的数据总体分为两种结构化数据和非结构化数据。 结构化数据指具有固定格式或有限长度的数据如数据库元数据等。非结构化数据指不定长或无固定格式的数据如邮件word文档等磁盘上的文件 结构化数据搜索 常见的结构化数据也就是数据库中的数据。在数据库中搜索很容易实现通常都是使用sql语句进行查询而且能很快的得到查询结果。 为什么数据库搜索很容易 因为数据库中的数据存储是有规律的有行有列而且数据格式、数据长度都是固定的。 非结构化数据查询方法 1顺序扫描法 所谓顺序扫描比如要找内容包含某一个字符串的文件就是一个文档一个文档的看对于每一个文档从头看到尾如果此文档包含此字符串则此文档为我们要找的文件接着看下一个文件直到扫描完所有的文件。如利用windows的搜索也可以搜索文件内容只是相当的慢。 2全文检索 将非结构化数据中的一部分信息提取出来重新组织使其变得有一定结构然后对此有一定结构的数据进行搜索从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息我们称之索引。 例如字典。字典的拼音表和部首检字表就相当于字典的索引对每一个字的解释是非结构化的如果字典没有音节表和部首检字表在茫茫辞海中找一个字只能顺序扫描。然而字的某些信息可以提取出来进行结构化处理比如读音就比较结构化分声母和韵母于是将读音拿出来按一定的顺序排列每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音然后按其指向的页数便可找到我们的非结构化数据——也即对字的解释。 虽然创建索引的过程也是非常耗时的但是索引一旦创建就可以多次使用全文检索主要处理的是查询所以耗时间创建索引是值得的。
正向索引forward index
在搜索引擎中每个文件都对应一个文件ID文件内容被表示为一系列关键词的集合实际上在搜索引擎索引库中关键词也已经转换为关键词ID。例如“文档1”经过分词提取了20个关键词每个关键词都会记录它在文档中的出现次数和出现位置。
问题当用户在主页上搜索关键词“华为手机”时假设只存在正向索引forward index那么就需要扫描索引库中的所有文档找出所有包含关键词“华为手机”的文档再根据打分模型进行打分排出名次后呈现给用户。因为互联网上收录在搜索引擎中的文档的数目是个天文数字这样的索引结构根本无法满足实时返回排名结果的要求。 反向索引inverted index
更熟悉的名字是倒排索引
搜索引擎会将正向索引重新构建为倒排索引即把文件ID对应到关键词的映射转换为关键词到文件ID的映射每个关键词都对应着一系列的文件这些文件中都出现这个关键词。 全文检索的实现可以使用Lucene实现全文检索。Lucene是apache下的一个开放源代码的全文检索引擎工具包。提供了完整的查询引擎和索引引擎部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包以方便的在目标系统中实现全文检索的功能。
应用场景对于数据量大、数据结构不固定的数据可采用全文检索方式搜索比如百度、Google等搜索引擎、论坛站内搜索、电商网站站内搜索等。
索引和搜索流程图 1、绿色表示索引过程对要搜索的原始内容进行索引构建一个索引库索引过程包括
确定原始内容即要搜索的内容 —-采集文档—-创建文档—-分析文档—-索引文档
2、红色表示搜索过程从索引库中搜索内容搜索过程包括
用户通过搜索界面—-创建查询—执行搜索从索引库搜索—渲染搜索结果
全文检索大体分两个过程索引创建 (Indexing) 和搜索索引 (Search) 。 索引创建将现实世界中所有的结构化和非结构化数据提取信息创建索引的过程。 搜索索引得到用户的查询请求搜索创建的索引然后返回结果的过程。
创建索引
对文档索引的过程将用户要搜索的文档内容进行索引索引存储在索引库index中。
索引里面究竟需要存些什么呢
首先我们来看为什么顺序扫描的速度慢
其实是由于我们想要搜索的信息和非结构化数据中所存储的信息不一致造成的。
非结构化数据中所存储的信息是每个文件包含哪些字符串也即已知文件欲求字符串相对容易也即是从文件到字符串的映射。
而我们想搜索的信息是哪些文件包含此字符串也即已知字符串欲求文件也即从字符串到文件的映射。
两者恰恰相反。于是如果索引总能够保存从字符串到文件的映射则会大大提高搜索速度。
1) 创建文档对象
获取原始内容的目的是为了索引在索引前需要将原始内容创建成文档Document文档中包括一个一个的域Field域中存储内容。
这里我们可以将磁盘上的一个文件当成一个documentDocument中包括一些Fieldfile_name文件名称、file_path文件路径、file_size文件大小、file_content文件内容如下图 注意每个Document可以有多个Field不同的Document可以有不同的Field同一个Document可以有相同的Field域名和域值都相同
每个文档都有一个唯一的编号就是文档id。
2) 分析文档
将原始内容创建为包含域Field的文档document需要再对域中的内容进行分析分析成为一个一个的单词。
原文档内容
vivo X23 8GB128GB 幻夜蓝 全网通4G手机
华为 HUAWEI 麦芒7 6G64G 亮黑色 全网通4G手机
分析后得到的词
vivo, x23, 8GB, 128GB, 幻夜, 幻夜蓝, 全网, 全网通, 网通, 4G, 手机, 华为, HUAWEI, 麦芒7。。。。
切分后得到的词用来做成索引目录。
3) 创建索引
索引的目的是为了搜索最终要实现只搜索被索引的语汇单元从而找到Document文档。
注意创建索引是对语汇单元索引通过词语找文档这种索引的结构叫倒排索引结构。 传统方法是根据文件找到该文件的内容在文件内容中匹配搜索关键字这种方法是顺序扫描方法数据量大、搜索慢。
倒排索引结构是根据内容词语找文档如下图
正排索引 转化成倒排索引 说明 “单词ID”一栏记录了每个单词的单词编号 第二栏是对应的单词 第三栏即每个单词对应的倒排列表 比如单词“谷歌”其单词编号为1倒排列表为{1,2,3,4,5}说明文档集合中每个文档都包含了这个单词。
而事实上索引系统还可以记录除此之外的更多信息在单词对应的倒排列表中不仅记录了文档编号还记载了单词频率信息TF即这个单词在某个文档中的出现次数之所以要记录这个信息是因为词频信息在搜索结果排序时计算查询和文档相似度是很重要的一个计算因子所以将其记录在倒排列表中以方便后续排序时进行分值计算。
倒排索引结构也叫反向索引结构包括索引和文档两部分索引即词汇表它的规模较小而文档集合较大。 Elasticsearch与mysql的区别
响应时间
MySQL
背景当数据库中的文档数仅仅上万条时关键词查询就比较慢了。如果一旦到企业级的数据响应速度就会更加不可接受。
原因在数据库做模糊查询时如LIKE语句它会遍历整张表同时进行字符串匹配。
例如在数据库查询“手机”时数据库会在每一条记录去匹配“手机”这两字是否出现。实际上并不是所有记录都包含“手机”所以做了很多无用功。
这个步骤都不高效而且随着数据量的增大消耗的资源和时间都会线性的增长。
Elasticsearch
提升小张使用了ES搜索服务后发现这个问题被很好解决TB级数据在毫秒级就能返回检索结果很好地解决了痛点。
原因Elasticsearch是基于倒排索引的例子如下。 当搜索“手机”时Elasticsearch就会立即返回文档FGH。这样就不用花多余的时间在其他文档上了因此检索速度得到了数量级的提升。
分词
MySQL
背景在做中文搜索时组合词检索在数据库是很难完成的。
例如当用户在搜索框输入“四川火锅”时数据库通常只能把这四个字去进行全部匹配。可是在文本中可能会出现“推荐四川好吃的火锅”这时候就没有结果了。
原因数据库并不支持分词。如果人工去开发分词功能费时费精力。
Elasticsearch
提升使用ES搜索服务后就不用太过于关注分词了因为Elasticsearch支持中文分词插件很好地解决了问题。
原因当用户使用Elasticsearch时进行搜索时Elasticsearch就自动分好词了。
例如 输入“四川火锅”时Elasticsearch会自动做下面两件事 1 将“四川火锅”分词成“四川”和“火锅” 2 查找包含这两个词的文档
相关性
MySQL
背景在用数据库做搜索时结果经常会出现一系列不匹配的文档。思考 · 到底什么文档是用户真正想要的呢 · 怎么才能把用户想看的文档放在搜索列表最前面呢
原因数据库并不支持相关性搜索。
例如当用户搜索“咖啡厅”的时候他很可能更想知道附近哪里可以喝咖啡而不是怎么开咖啡厅。
Elasticsearch
提升使用了ES搜索服务后发现Elasticsearch能很好地支持相关性评分。通过合理的优化ES搜索服务能够返回精准的结果满足用户的需求。
原因Elasticsearch支持全文搜索和相关度评分。这样在返回结果就会根据分数由高到低排列。分数越高意味着和查询语句越相关。
例如当用户搜索“星巴克咖啡”带有“星巴克咖啡”的信息就要比只包含“咖啡”的信息靠前。
总结
1.传统数据库在全文检索方面很鸡肋海量数据下的查询很慢对非结构化文本数据的不支持ES支持非结构化数据的存储和查询。
2.ES支持分布式文档存储。
3.ES是分布式实时搜索并且响应时间比关系型数据库快。
4.ES在分词方面比关系型好能做到精确分词。
5.ES对已有的数据在数据匹配性方面比关系型数据库好 例如搜索“星巴克咖啡”ES会优先返回带有“星巴克咖啡”的数据不会优先返回带有“咖啡”的数据。
ElasticSearch和MySql分工不同MySQL负责存储数据ElasticSearch负责搜索数据。
ElasticSearch安装与启动
ElasticSearch分为Linux和Window版本基于我们主要学习ElasticSearch的Java客户端的使用所以我们课程中使用的是安装较为简便的Window版本项目上线后公司的运维人员会安装Linux版的ES供我们连接使用。
ElasticSearch的官方地址 https://www.elastic.co/products/elasticsearch
ElasticSearch7.8 的官方文档地址https://www.elastic.co/guide/en/elasticsearch/reference/7.8/getting-started.html
需要的资源 安装服务
Window版的ElasticSearch的安装很简单解压开即安装完毕解压后的ElasticSearch的目录结构如下 安装IK分词器插件在plugin目录下创建ik文件夹将elasticsearch-analysis-ik-7.8.0.zip内容解压到ik目录下 点击ElasticSearch下的bin目录下的elasticsearch.bat启动控制台显示的日志信息如下 注意9300是tcp通讯端口集群间和TCPClient都执行该端口9200是http协议的RESTful接口 。
通过浏览器访问ElasticSearch服务器http://localhost:9200 注意事项一ElasticSearch是使用java开发的且本版本的es需要的jdk版本要是1.8以上所以安装ElasticSearch之前保证JDK1.8安装完毕并正确的配置好JDK环境变量否则启动ElasticSearch失败。 注意事项二出现闪退通过路径访问发现“空间不足” 【解决方案】 修改jvm.options文件的22行23行 Elasticsearch启动的时候占用1个G的内存可改成512m -Xmx512m设置JVM最大可用内存为512M。 -Xms512m设置JVM初始内存为512m。此值可以设置与-Xmx相同以避免每次垃圾回收完成后JVM重新分配内存。 Kibana客户端(Windows版)
Kibana是一个针对Elasticsearch的开源分析及可视化平台用来搜索、查看交互存储在Elasticsearch索引中的数据。
解压kibana-7.8.0-windows-x86_64.zip 进入config目录修改kibana.yml第2、28行配置自身端口和连接的ES服务器地址。 server.port: 5601 elasticsearch.hosts: [“http://localhost:9200”] 进入kibana的bin目录双击kibana.bat启动注es不可以关闭 访问http://localhost:5601出现以下界面即完成安装。 界面是英文的如果希望是中文可以修改kibana.yml第115行i18n.locale: “zh-CN”
Elasticsearch head客户端
head插件是ES的一个可视化管理插件用来监视ES的状态并通过head客户端和ES服务进行交互比如创建映射、创建索引等。
将ElasticSearch-head-Chrome-0.1.5-Crx4Chrome.crx用压缩工具解压打开Chrome扩展程序点” 加载已解压的扩展程序”按钮找到解压目录即可。 点击head图标输入ES服务器地址http://localhost:9200 使用IK分词器
IKAnalyzer是一个开源的基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始IKAnalyzer已经推出 了3个大版本。最初它是以开源项目Lucene为应用主体的结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为 面向Java的公用分词组件独立于Lucene项目同时提供了对Lucene的默认优化实现。
IK分词器3.0的特性如下
1采用了特有的“正向迭代最细粒度切分算法“具有60万字/秒的高速处理能力。 2采用了多子处理器分析模式支持英文字母IP地址、Email、URL、数字日期常用中文数量词罗马数字科学计数法中文词汇姓名、地名处理等分词处理。 3对中英联合支持不是很好,在这方面的处理比较麻烦.需再做一次查询,同时是支持个人词条的优化的词典存储更小的内存占用。 4支持用户词典扩展定义。 5针对Lucene全文检索优化的查询分析器IKQueryParser采用歧义分析算法优化查询关键字的搜索排列组合能极大的提高Lucene检索的命中率。
下载地址https://github.com/medcl/elasticsearch-analysis-ik/releases
在没有使用IK分词器时默认是standard方式分词这种方式分词就是一个字就是一个词。
而IK分词器有两种分词模式ik_max_word和ik_smart模式。
ik_max_word :会将文本做最细粒度的拆分比如会将“乒乓球明年总冠军”拆分为“乒乓球、乒乓、球、明年、总冠军、冠军。
#方式一ik_max_word
GET /_analyze
{analyzer: ik_max_word,text: 乒乓球明年总冠军
}#分词器执行结果
{tokens : [{token : 乒乓球,start_offset : 0,end_offset : 3,type : CN_WORD,position : 0},{token : 乒乓,start_offset : 0,end_offset : 2,type : CN_WORD,position : 1},{token : 球,start_offset : 2,end_offset : 3,type : CN_CHAR,position : 2},{token : 明年,start_offset : 3,end_offset : 5,type : CN_WORD,position : 3},{token : 总冠军,start_offset : 5,end_offset : 8,type : CN_WORD,position : 4},{token : 冠军,start_offset : 6,end_offset : 8,type : CN_WORD,position : 5}]
} ik_smart: 会做粗粒度的拆分比如会将“乒乓球明年总冠军”拆分为乒乓球、明年、总冠军。
#ik_smart方式
GET /_analyze
{analyzer: ik_smart,text: [乒乓球明年总冠军]
}#结果
{tokens : [{token : 乒乓球,start_offset : 0,end_offset : 3,type : CN_WORD,position : 0},{token : 明年,start_offset : 3,end_offset : 5,type : CN_WORD,position : 1},{token : 总冠军,start_offset : 5,end_offset : 8,type : CN_WORD,position : 2}]
} ElasticSearch相关概念(术语)
Elasticsearch的文件存储Elasticsearch是面向文档型数据库一条数据在这里就是一个文档用JSON作为文档序列化的格式比如下面这条用户数据
{name : jack,sex : Male,age : 25,birthDate: 1990/05/01,about : I love to go rock climbing,interests: [ sports, music ]
}Elasticsearch可以看成是一个数据库只是和关系型数据库比起来数据格式和功能不一样而已 索引 Index
文档存储的地方类似于MySQL数据库中的数据库概念
类型 Type
如果按照关系型数据库中的对应关系还应该有表的概念。ES中没有表的概念这是ES和数据库的一个区别在我们建立索引之后可以直接往 索引 中写入文档。
在6.0版本之前ES中有Type的概念可以理解成关系型数据库中的表但是官方说这是一个设计上的失误所以在6.0版本之后Type就被废弃了。
字段 Field
相当于是数据表的字段字段在ES中可以理解为JSON数据的键下面的JSON数据中name 就是一个字段。
{name:jack
}映射 Mapping
映射 是对文档中每个字段的类型进行定义每一种数据类型都有对应的使用场景。
每个文档都有映射但是在大多数使用场景中我们并不需要显示的创建映射因为ES中实现了动态映射。
我们在索引中写入一个下面的JSON文档在动态映射的作用下name会映射成text类型age会映射成long类型。
{name:jack,age:18,
}自动判断的规则如下 Elasticsearch中支持的类型如下 string类型在ElasticSearch 旧版本中使用较多从ElasticSearch 5.x开始不再支持string由text和keyword类型替代。已经废弃 text 类型需要分词设置text类型比如Email内容、产品描述应该使用text类型。 keyword类型 不需要分词设置keyword类型比如email地址、主机名、状态码和标签。
复杂数据类型 数组[] 对象{}
文档 Document
文档 在ES中相当于传统数据库中的行的概念ES中的数据都以JSON的形式来表示在MySQL中插入一行数据和ES中插入一个JSON文档是一个意思。下面的JSON数据表示一个包含3个字段的文档。
{name:jack,age:18,gender:1
}一个文档不只有数据。它还包含了元数据(metadata)——关于文档的信息。三个必须的元数据节点是
节点说明_index文档存储的地方_type文档代表的对象的类_id文档的唯一标识_score文档的评分