最新动态
Elasticsearch学习/调优
2024-10-31 22:06

img

Elasticsearch学习/调优

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。

Elasticsearch是一个全文检索服务器(全文检索是一种非结构化数据的搜索方式

结构化数据:指具有固定格式固定长度的数据,如数据库中的字段。

非结构化数据:指格式和长度不固定的数据,如电商网站的商品详情

结构化数据一般存入数据库,使用sql语句即可快速查询。但由于非结构化数据的数据量大且格式不固定,我们需要采用全文检索的方式进行搜索。全文检索通过建立倒排索引加快搜索效率。

索引:将数据中的一部分信息提取出来,重新组成一定的数据结构,然后根据该结构进行快速搜索。索引就是目录,列如字典会将字的拼音提取出来做成目录,通过目录可以快速找到字的位置。

正向索引(正排索引

将文档ID建立为索引,通过ID可以快速查找到数据,如果数据库中的主键就会创建正排索引。

反向索引(倒排索引

非结构化数据中往往会根据关键词查询数据,将数据中的关键词建立索引,指向文档数据,这样的索引称为反向索引。

  1. 2013年初,GitHub抛弃了Solr,采取Elasticsearch来做PB级的搜索。GitHub使用Elasticsearch搜索20TB 的数据,包括13亿文件和1300亿行代码。
  2. 维基百科:以Elasticsearch为基础的核心搜索架构。
  3. 百度:百度目前广泛使用Elasticsearch作为文本数据分析,采集百度所有服务器上的各类指标数据及用户自定义数据。目前覆盖百度内部20多个业务线(包括casio、云分析、网盟、预测、文库、
  4. 直达号、钱包、风控等,单集群最大100台机器,200个ES节点,每天导入30TB+数据 。
  5. 新浪使用ES分析处理32亿条实时日志。
  6. 阿里使用ES构建自己的日志采集和分析体系。
  7. 可以使用Elasticsearch实现全站搜索,线上商城系统的搜索,分析日志等功能。

目前Elasticsearch的市场占有率越来越高,Spring从2020年起也已经停止Spring Data Solr的维护,更多的公司使用Elasticsearch作为搜索引擎。

Solr是Apache下的顶级开源项目,采用java开发,它也是基于Lucene的全文检索服务器。solr提供优化比Lucene跟为丰富的查询语言,同时实现了可配置、可拓展,并对索引、搜索性能进行了优化 solr可以独立运行,运行在jetty、tomcat等这些servlet容器中,Sole索引的实现方法很简单,用post方法向solr服务器发送一条可描述Filed及其内容的XML文档,Solr根据xml文档的添加、删除、更新索引、Solr搜索只需要发送HTTP GET请求,然后对solr返回xml、json等格式的查询结果进行解析,组织页面布局、solr不提供构建UI的功能,solr提供了一个管理界面,通过管理界面可以对查询的solr的配置和运行情况 Solr是一个开源搜索平台,用于构建搜索应用程序。 是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口 它建立在Lucene(全文搜索引擎)之上Solr是企业级的,快速的和高度可扩展的。

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

文档(document

类型(Type

具有一组共同字段的文档定义成一个类型,类似关系型数据库中的表的概念

索引(Index

(Fied

文档由多个域组成,类型关系型数据中字段的概念

ES7.x之后删除了type的概念,一个索引不会代表一个库,而是一张张表

映射(Mapping

Elasticsearch使用Restful风格请求访问操作的,请求参数和返回值都是json格式.

索引操作

创建索引

img

查询索引

img

green状态:每个索引的primary shard和replica shard都是active状态
yellow : 每个索引的primary shard都是active状态,但是部分replica shard不是active状态,处于不可用状态
red: 不是所有的索引的primary shard都是active状态,部分索引有数据丢失了

删除索引

映射操作

创建映射
查询映射

img

文档操作

添加文档
查询文档
删除文档
更新文档
批量操作

高级查询

语法:GET /索引名/_doc/_search {json格式请求体数据}

查询所有
关键字查询

NOTE1: 通过使用term查询得知ES中默认使用分词器为标准分词器(StandardAnalyzer),标准分词器对于英文单词分词,对于中文单字分词。

NOTE2: 通过使用term查询得知,在ES的Mapping Type 中 keyword , date ,integer, long , double , boolean or ip 这些类型不分词,只有text类型分词。

查询范围(range
前缀查询(prefix)
通配符查询(wildcard)
多id查询(ids)
模糊查询(fuzzy)

注意: fuzzy 模糊查询 最大模糊错误 必须在0-2之间

  • 搜索关键词长度为 2 不允许存在模糊
  • 搜索关键词长度为3-5 允许一次模糊
  • 搜索关键词长度大于5 允许最大2模糊
布尔查询(bool)

bool 关键字: 用来组合多个条件实现复杂查询

must: 相当于&& 同时成立

should: 相当于|| 成立一个就行

must_not: 相当于! 不能满足任何一个

多字段查询(multi_match)

字段类型分词,将查询条件分词之后进行查询改字段 如果该字段不分词就会将查询条件作为整体进行查询

默认字段分词查询(query_string)

查询字段分词就将查询条件分词查询 查询字段不分词将查询条件不分词查询

高亮查询(highlight)
highlight 关键字
自定义高亮html标签
多字段高亮
返回指定条数(size)
指定字段排序(sort)
返回指定字段([_source])

聚合查询

根据某个字段分组
求最大值
求最小值
求平均值
求和

Analysis和Analyzer

分词就是将文档通过Analyzer分成一个个的Term,每一个Term都指向这个Term的文档。

Analysis:文本分析是把全文转换成一系列单词(term/token)的过程

Analyzer:是通过Analyzer来实现的。

Analyzer组成

在ES中默认使用标准分词器: StandardAnalyzer 特点: 中文单字分词 单词分词。如:“我是中国人 this is good man----> 我 是 中 国 人 this is good man”

分析器(Analyzer

组成部分(character filters、tokenizers、token filters

character filter(字符过滤器)

在一段文本进行分词之前,先进行预处理,比如说最常见的就是,过滤html标签(hello --> hello,& --> and(I&you --> I and you

tokenizers(分词器)

英文分词可以根据空格将单词分开,中文分词比较复杂,可以采用机器学习算法来分词。

Token filters (Token过滤器)

将切分的单词进行加工。大小写转换(例将“Quick”转为小写,去掉停用词(例如停用词像“a”、“and”、“the”等等,加入同义词(例如同义词像“jump”和“leap”)。

三者顺序:Character Filters—>Tokenizer—>Token Filter

三者个数:Character Filters(0个或多个+ Tokenizer + Token Filters(0个或多个)

内置分词器

  1. Standard Analyzer - 默认分词器,英文按单词词切分,并小写处理
  2. Simple Analyzer - 按照单词切分(符号被过滤), 小写处理
  3. Stop Analyzer - 小写处理,停用词过滤(the,a,is)
  4. Whitespace Analyzer - 按照空格切分,不转小写
  5. Keyword Analyzer - 不分词,直接将输入当作输出
标准分词器
Simple(分词器)
Whitespace(分词器)

创建索引设置分词

中文分词器

IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。提供了两种分词算法

  1. ik_smart:最少切分
  2. ik_max_word:最细粒度划分

ik分词器的版本要和es版本保持一致。

img

img

扩展词、停用词配置

IK支持自定义扩展词典和停用词典

  • 扩展词典就是有些词并不是关键词,但是也希望被ES用来作为检索的关键词,可以将这些词加入扩展词典。
  • 停用词典就是有些词是关键词,但是出于业务场景不想使用这些关键词被检索到,可以将这些词放入停用词典。

定义扩展词典和停用词典可以修改IK分词器中config目录中IKAnalyzer.cfg.xml这个文件。

Filter Query

过滤查询,其实准确来说,ES中的查询操作分为2种: 查询(query)和过滤(filter)。查询即是之前提到的query查询,它 (查询)默认会计算每个返回文档的得分,然后根据得分排序。而过滤(filter)只会筛选出符合的文档,并不计算 得分,而且它可以缓存文档 。所以,单从性能考虑,过滤比查询更快。 换句话说过滤适合在大范围筛选数据,而查询则适合精确匹配数据。一般应用时, 应先使用过滤操作过滤数据, 然后使用查询匹配数据。

注意:

  • 在执行 filter 和 query 时,先执行 filter 在执行 query
  • Elasticsearch会自动缓存经常使用的过滤器,以加快性能。

常见过滤类型有: term 、 terms 、ranage、exists、ids等filter。

term 、 terms Filter
ranage filter
exists filter
ids filter

img

引入依赖

配置客户端

客户端对象

测试类

RestHighLevelClient的API作为ElasticSearch备受推荐的客户端组件,其封装系统操作ES的方法,包括索引结构管理,数据增删改查管理,常用查询方法,并且可以结合原生ES查询原生语法,功能十分强大。

Spring Data ES是Spring对原生JAVA操作ES封装之后的产物,通过对原生API的封装,简化对ES的操作。

实体类创建

Repository接口

测试

一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,这个名字默认就是elasticsearch。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。

集群名字概念

节点

一个节点是你集群中的一个服务器,作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点。

索引

一组相似文档的集合

映射

用来定义索引存储文档的结构如:字段、类型等。

文档

索引中一条记录,可以被索引的最小单元

分片

Elasticsearch提供了将索引划分成多份的能力,这些份就叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置 到集群中的任何节点上。

复制

Index的分片中一份或多份副本。

  1. 分片的数量只能在索引创建时指定,索引创建后不能再更改分片数量,但可以改变副本的数量。
  2. 为保证节点发生故障后集群的正常运行,ES不会将某个分片和它的副本存在同一台节点上。

集群优化

水平扩容
  1. 关闭一个节点,可以发现ES集群可以自动进行故障应对。
  2. 重新打开该节点,可以发现ES集群可以自动进行水平扩容。
  3. 分片数不能改变,但是可以改变每个分片的副本数
磁盘选择

ES的优化即通过调整参数使得读写性能更快磁盘通常是服务器的瓶颈。Elasticsearch重度使用磁盘,磁盘的效率越高,Elasticsearch的执行效率就越高。这里有一些优化磁盘的技巧

  1. 使用SSD(固态硬盘,它比机械磁盘优秀多了。
  2. 使用RAID0模式(将连续的数据分散到多个硬盘存储,这样可以并行进行IO操作),代价是一块硬盘发生故障就会引发系统故障。
  3. 不要使用远程挂载的存储。
分片策略

分片和副本数并不是越多越好。每个分片的底层都是一个Lucene索引,会消耗一定的系统资源。且搜索请求需要命中索引中的所有分片,分片数过多会降低搜索性能。索引的分片数需要架构师和技术人员对业务的增长有预先的判断,一般来说我们遵循以下原则

  1. 每个分片占用的硬盘容量不超过ES的最大JVM的堆空间设置(一般设置不超过32G)。比如:如果索引的总容量在500G左右, 那分片数量在16个左右即可。
  2. 分片数一般不超过节点数的3倍。比如:如果集群内有10个节点,则分片数不超过30个。
  3. 推迟分片分配:节点中断后集群会重新分配分片。但默认集群会等待一分钟来查看节点是否重新加入。我们可以设置等待的时长,减少重新分配的次数
  4. 减少副本数量:进行写入操作时,需要把写入的数据都同步到副本,副本越多写入的效率就越慢。我们进行大批量进行写入操作 时可以先设置副本数为0,写入完成后再修改回正常的状态。
内存设置
    以上就是本篇文章【Elasticsearch学习/调优】的全部内容了,欢迎阅览 ! 文章地址:http://dfvalve.xrbh.cn/quote/4322.html 
     行业      资讯      企业新闻      行情      企业黄页      同类资讯      网站地图      返回首页 迅博思语资讯移动站 http://keant.xrbh.cn/ , 查看更多