温馨提示:距离2024年结束还剩18天,剩余约为4.92%...

转载

ElasticSearch的常见问题及其解答

1.ElasticSearch对比Solr?

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

2.ElasticSearch插入百万级的数据怎么做?

  1. 通过JPA的save方法也可以批量插值,但适用于小数据量
  2. 超大数据的插入就要用ES自带的bulk了,可以迅速插入百万级的数据。
  3. 在ElasticSearchTemplate里也提供了对应的方法。

3.Es在项目中怎么使用?

  1. 搭建集群
  2. 安装ik分词器,配置自定义分词词库
  3. 定义Bean
    • 定义索引名称、类型名称、文档名称
    • 定义映射关系
      • 哪些需要分词-》name
      • 哪些不需要分词-》categoryName,brandName
      • 规格使用动态类型Object-》private Map String, Object specMap
  4. 索引初始化
  5. 动态索引更新
  6. 关键字搜索
  7. 聚合查询(普通域、动态域),显示品牌和规格
  8. 多条件过滤查询
  9. 范围过滤查询
  10. 分页搜索
  11. 排序搜索
  12. 高亮搜索

4.ES查询慢,如何去解决?

  1. 思路1:索引层面。 8亿条分散到多个索引、多个副本当中
  2. 思路2:Mapping映射设计层面。 举例,设计高效检索Number类型建议改成keyword
  3. 思路3:检索DSL优化层面 注意:能使用filter过滤检索的就不要使用query
  4. 思路4:返回字段层面 ,有没有检索的使用source:限定返回的字段, 如果没有,会全字段返回,数据量大的话,也会慢。
  5. 思路5:DSL 调试 调试方法:DSL执行语句中加上profile:true . 或者借助:xpack可视化插件排查。 这样,会打印出对应查询的细节花费时间,让你明明白白知道那里慢了。
  6. 思路6:日志查询 查询的时候,查询ES日志,看看有没有大量的gc。 看看有没有错误日志,错误日志的处理就是优化的方向。
  7. 思路7:借助cerebro或者xpack mointer监视集群状态 看一看,集群堆内存、cpu、负载的使用情况。
  8. 思路8:外部思维 想一想,查询的时候,有没有并行的写入操作? 那么查询的时候慢,是不是写入压力大队集群造成的影响。
  9. 思路9:排除网络慢的原因 内网查询还是外网映射查询,返回时间也不一样。
  10. 思路10:其他问题 结合业务场景进行分析,自己的业务代码逻辑的问题。 一定要转成DSL进行最小化定位。

5.es的原理是什么?

  1. Elasticsearch底层使用的使用的lucene
  2. lucene使用的是倒排索引的方式来进行加快检索速度
  3. 倒排索引就是根据单词找到对应的文档 Id

6.为什么用es不用mysql的索引?

  1. 数据库的索引是B+tree结构;ES基于的是倒排索引。
  2. ES可以处理分词后的全文搜索,对于mysql关系型数据库而言完全是灾难。比如查询包含关键字mysql的like "%word%" mysql全表查,es只需要查"word"这个词包含的文档id 速度明显不是一个级别。
  3. ES可以处理海量数据的搜索
  4. 搜索方面,ES提供了更加丰富的功能。

7.同步MySQL的数据到ES?

  1. 分全量同步与增量同步
  2. 全量同步是指全部将数据同步到es,通常是刚建立es,第一次同步时使用。增量同步是指将后续的更新、插入记录同步到es
  3. 我所知道的方案如下:
    • 全量同步
      • 自己写代码进行初始同步
      • Logstash配合logstash-input-jdbc插件
    • 增量同步
      • canal实现增量同步MySQL的数据

8.说一下ES?

  1. 开源的Elasticsearch(简称ES)是开源搜索引擎,基于Lucene。
  2. 可以通过RESTful API进行全文搜索。
  3. 近实时,es从数据写入到数据被搜索到有一个延时(大概1秒),基于es执行的搜索和分析可以达到秒级。
  4. 作为一个大型分布式集群(数百台服务器)技术,处理海量数据(PB级)数据,服务大公司;也可以运行在单机上,服务小公司
  5. 基本概念索引、类型、文档、字段。

9.说一下Es的分片和副本?

  1. 默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个复制。假如集群中有两个节点,你的索引将会有5个主分片和另外5个复制分片(1个完全拷贝),这样的话每个索引总共就有10个分片。
  2. 分片可以预防索引过大,存不下。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;
  3. 分片在多个节点上进行分布式的、并行的操作,进而提高性能/吞吐量。
  4. 副本在分片/节点失败的情况下,提供了高可用性。
  5. 副本可以扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并行运行
  6. 复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的。

10.谈谈你对ES的DSL的理解?

  1. es基于restful构建查询,传递json参数就可以操作es。
  2. DSL 其实是 Domain Specific Language 的缩写,中文翻译为领域特定语言(下简称 DSL),es通过DSL语言对传递的JSON的具体格式和内容做了限定。
  3. 那es的dsl,就是传递符合限定的json字符串。
  4. json的组合构成了具体的功能:
    • 索引操作
    • 映射操作
    • 文档操作
    • 查询操作
    • 过滤操作
    • 聚合操作
    • 分页、高亮
  5. 常见的查询有:
    • match、match_phrase、query_string、multi_match等。
  6. 常见的过滤有:
    • term、range、exists、wildcard、prefix、fuzzy等
  7. 学习es的功能,就是学习es可以传递哪些格式的json字符串。
  8. es6.3版本后支持sql,缩减了dsl的学习成本
  • 作者:CZC(关于作者)
  • 发表时间:2024-07-14 12:07
  • 版权声明
  • 评论区:

    留言