最新ES面试题整理(Elasticsearch面试指南系列)(上)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 最新ES面试题整理(Elasticsearch面试指南系列)

引言

看到网上各式各样关于Elasticsearch面试题的文章,但是貌似都不是很全面,所以特意整理了一篇关于常见的ES面试题,已收录至面试专栏,计划更新 10/50 个常见面试题,此次先发出来 10个,后续更新,请关注我的博客,第一时间查看更新。


另外,本文目前对面试问题的描述存在以下几个问题,将在后续更新中不断改善,是的这篇文章还会改进!

  • 答案过于书面,需要自己组织语言
  • 只适合


Question1:Elasticsearch是什么

Elasticsearch是由 Java语言开发基于Lucene的一款开源的搜索、聚合分析和存储引擎。同时它也可以称作是一种非关系型文档数据库。

  • 天生分布式、高性能、高可用、易扩展、易维护。
  • 跨语言、跨平台:几乎支持所有主流编程语言,并且支持在“Linux、Windows、MacOS”多平台部署
  • 支持结构化、非结构化、地理位置搜索等
  • 海量数据的全文检索,搜索引擎、垂直搜索、站内搜索:
  • 百度、知乎、微博、CSDN
  • 导航、外卖、团购等软件
  • 以京东、淘宝为代表的垂直搜索
  • B站、抖音、爱奇艺、QQ音乐等音视频软件
  • GIthub
  • 数据分析和聚合查询
  • 日志系统:ELK


Question 2:ES中mapping是什么,你知道es哪些数据类型?

2.1 mapping解释

ES中的mapping有点类似与RDB中“表结构”的概念,在MySQL中,表结构里包含了字段名称,字段的类型还有索引信息等。在Mapping里也包含了一些属性,比如字段名称、类型、字段使用的分词器、是否评分、是否创建索引等属性,并且在ES中一个字段可以有对个类型。分词器、评分等概念在后面的课程讲解。


2.2 ES数据类型

2.2.1 常见类型

  1. **数字类型:**long integer short byte double float half_float scaled_float unsigned_long
  2. Keywords:

keyword:适用于索引结构化的字段,可以用于过滤、排序、聚合。keyword类型的字段只能通过精确值(exact value)搜索到。Id应该用keyword。keyword字段通常用于排序汇总Term查询,例如term

constant_keyword:始终包含相同值的关键字字段

wildcard:可针对类似grep的通配符查询优化日志行和类似的关键字值


  1. dates(时间类型):包括datedate_nanos.
  2. alias:为现有字段定义别名。
  3. text:当一个字段是要被全文搜索的,比如Email内容、产品描述,这些字段应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索 引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合。(解释一下为啥不会为text创建正排索引:大量堆空间,尤其是 在加载高基数text字段时。字段数据一旦加载到堆中,就在该段的生命周期内保持在那里。同样,加载字段数据是一个昂贵的过程,可能导致用户遇到延迟问 题。这就是默认情况下禁用字段数据的原因)


2.2.2 对象关系类型

  1. object:用于单个JSON对象
  2. nested:用于JSON对象数组
  3. join:为同一索引中的文档定义父/子关系。


2.2.3 结构化类型

  1. geo-point:纬度/经度积分
  2. geo-shape:用于多边形等复杂形状
  3. point:笛卡尔坐标点
  4. shape:笛卡尔任意几何图形


2.3 自动映射和手工映射

2.3.1 Dynamic field mapping:

  • 整数 => long
  • 浮点数 => float
  • true || false => boolean
  • 日期 => date
  • 数组 => 取决于数组中的第一个有效值
  • 对象 => object
  • 字符串 => 如果不是数字和日期类型,那会被映射为text和keyword两个类型
    除了上述字段类型之外,其他类型都必须显示映射,也就是必须手工指定,因为其他类型ES无法自动识别。


2.3.2 Expllcit field mapping:手动映射

 PUT /product
 {
    "mappings": {
        "properties": {
            "field": {
                "mapping_parameter": "parameter_value"
            }
        }
    }
}


2.4 映射参数

  1. index:是否对创建对当前字段创建倒排索引,默认true,如果不创建索引,该字段不会通过索引被搜索到,但是仍然会在source元数据中展示
  2. analyzer:指定分析器(character filter、tokenizer、Token filters)。
  3. boost:对当前字段相关度的评分权重,默认1
  4. coerce:是否允许强制类型转换 true “1”=> 1 false “1”=< 1
  5. copy_to:该参数允许将多个字段的值复制到组字段中,然后可以将其作为单个字段进行查询
  6. doc_values:为了提升排序和聚合效率,默认true,如果确定不需要对字段进行排序或聚合,也不需要通过脚本访问字段值,则可以禁用doc值以节省磁盘 空间(不支持text和annotated_text)
  7. dynamic:控制是否可以动态添加新字段
  8. true 新检测到的字段将添加到映射中。(默认)
  9. false 新检测到的字段将被忽略。这些字段将不会被索引,因此将无法搜索,但仍会出现在_source返回的匹配项中。这些字段不会添加到映射中,必须显式 添加新字段。
  10. strict 如果检测到新字段,则会引发异常并拒绝文档。必须将新字段显式添加到映射中
  11. eager_global_ordinals:用于聚合的字段上,优化聚合性能。
  12. Frozen indices(冻结索引):有些索引使用率很高,会被保存在内存中,有些使用率特别低,宁愿在使用的时候重新创建,在使用完毕后丢弃数据,Frozen indices的数据命中频率小,不适用于高搜索负载,数据不会被保存在内存中,堆空间占用比普通索引少得多,Frozen indices是只读的,请求可能是秒级或者分钟级。*eager_global_ordinals不适用于Frozen indices
  13. enable:是否创建倒排索引,可以对字段操作,也可以对索引操作,如果不创建索引,让然可以检索并在_source元数据中展示,谨慎使用,该状态无法修改。fielddata:查询时内存数据结构,在首次用当前字段聚合、排序或者在脚本中使用时,需要字段为fielddata数据结构,并且创建倒排索引保存到堆中
     PUT my_index
     {
       "mappings": {
         "enabled": false
       }
     }


  1. **fields:给field创建多字段,用于不同目的(全文检索或者聚合分析排序)
  2. format:格式化
"date": {
      "type":  "date",
      "format": "yyyy-MM-dd"
    }


ignore_above:超过长度将被忽略

ignore_malformed:忽略类型错误

index_options:控制将哪些信息添加到反向索引中以进行搜索和突出显示。仅用于text字段

Index_phrases:提升exact_value查询速度,但是要消耗更多磁盘空间

Index_prefixes:前缀搜索

min_chars:前缀最小长度,>0,默认2(包含)

max_chars:前缀最大长度,<20,默认5(包含)

meta:附加元数据

normalizer:

norms:是否禁用评分(在filter和聚合字段上应该禁用)。

null_value:为null值设置默认值**

position_increment_gap:

proterties:除了mapping还可用于object的属性设置

search_analyzer:设置单独的查询时分析器:

similarity:为字段设置相关度算法,支持BM25、claassic(TF-IDF)、boolean

store:设置字段是否仅查询

term_vector:**运维参数


Question 3:什么是全文检索(面试简化版)


3.1 相关度

  • 搜索:有明确的查询边界,比如:where name = xxx、where age > 30
  • 检索:讲究相关度,无明确的查询条件边界


3.2 图解全文检索

9d4ac00c931d404bd7172c0bc98c0eac.png


 GET index/_search
 {
   "query": {
     ***
   }
 }


Question 4:ES支持哪些类型的查询


4.1 按语言划分

  • Query DSL:Domain Specific Language
  • Script:脚本查询
  • Aggregations:聚合查询
  • SQL查询
  • EQL查询


4.2 按场景划分

4.2.1 Query String


  • 查询所有:
GET /product/_search


  • 带参数:
GET /product/_search?q=name:xiaomi


分页:

GET /product/_search?from=0&size=2&sort=price:asc


精准匹配 exact value

GET /product/_search?q=date:2021-06-01


_all搜索 相当于在所有有索引的字段中检索

GET /product/_search?q=2021-06-01


验证_all搜索

 PUT product
 {
   "mappings": {
     "properties": {
       "desc": {
         "type": "text", 
         "index": false
       }
     }
   }
 }
 # 先初始化数据
 POST /product/_update/5
 {
   "doc": {
     "desc": "erji zhong de kendeji 2021-06-01"
   }
 }


4.2.2 全文检索-Fulltext query

```
 GET index/_search
 {
   "query": {
     ***
   }
 }
```


  • match:匹配包含某个term的子句
  • match_all:匹配所有结果的子句
  • multi_match:多字段条件
  • match_phrase:短语查询,


4.2.3 精准查询-Term query

  • term:匹配和搜索词项完全相等的结果
  • term和match_phrase区别:
    match_phrase 会将检索关键词分词, match_phrase的分词结果必须在被检索字段的分词中都包含,而且顺序必须相同,而且默认必须都是连续的
    term搜索不会将搜索词分词
  • term和keyword区别
    term是对于搜索词不分词,
    keyword是字段类型,是对于source data中的字段值不分词


  • terms:匹配和搜索词项列表中任意项匹配的结果
  • range:范围查找


4.2.4 过滤器-Filter

 GET _search
 {
   "query": {
     "constant_score": {
       "filter": {
         "term": {
           "status": "active"
         }
       }
     }
   }
 }


filter:query和filter的主要区别在: filter是结果导向的而query是过程导向。query倾向于“当前文档和查询的语句的相关度”而filter倾向于“当前文档和查询的条件是不是相符”。即在查询过程中,query是要对查询的每个结果计算相关性得分的,而filter不会。另外filter有相应的缓存机制,可以提高查询效率。


4.2.5 组合查询-Bool query

bool:可以组合多个查询条件,bool查询也是采用more_matches_is_better的机制,因此满足must和should子句的文档将会合并起来计算分值

must:必须满足子句(查询)必须出现在匹配的文档中,并将有助于得分。

filter:过滤器 不计算相关度分数,cache☆子句(查询)必须出现在匹配的文档中。但是不像 must查询的分数将被忽略。Filter子句在filter上下文中执行,这意味着计分被忽略,并且子句被考虑用于缓存。

should:可能满足 or子句(查询)应出现在匹配的文档中。

must_not:必须不满足 不计算相关度分数 not子句(查询)不得出现在匹配的文档中。子句在过滤器上下文中执行,这意味着计分被忽略,并且子句被视为用于缓存。由于忽略计分,0因此将返回所有文档的分数。


minimum_should_match:参数指定should返回的文档必须匹配的子句的数量或百分比。如果bool查询包含至少一个should子句,而没有must或 filter子句,则默认值为1。否则,默认值为0


4.2.6 地理位置搜索

4.2.7 复杂类型查询

  • Object
  • Nested
  • Join


4.3 按数据类型(准确度)划分

  • 全文检索:match
  • 精确查找:term
  • 模糊查询:suggester、模糊查询、通配符、正则查找
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
2月前
|
存储 自然语言处理 算法
面试题ES问题之Solr和Elasticsearch功能实现如何解决
面试题ES问题之Solr和Elasticsearch功能实现如何解决
43 2
|
24天前
|
自然语言处理 Java 索引
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作
25 0
|
24天前
|
自然语言处理 Java 索引
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 索引操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 索引操作
29 0
|
24天前
|
自然语言处理 Docker 容器
ElasticSearch 实现分词全文检索 - ES、Kibana、IK分词器安装
ElasticSearch 实现分词全文检索 - ES、Kibana、IK分词器安装
15 0
|
2月前
|
数据库
面试题ES问题之Elasticsearch的排序分页和高亮功能如何解决
面试题ES问题之Elasticsearch的排序分页和高亮功能如何解决
21 0
|
18天前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
19天前
|
Java C++
【Java基础面试十七】、Java为什么是单继承,为什么不能多继承?
这篇文章讨论了Java单继承的设计原因,指出Java不支持多继承主要是为了避免方法名冲突等混淆问题,尽管Java类不能直接继承多个父类,但可以通过接口和继承链实现类似多继承的效果。
【Java基础面试十七】、Java为什么是单继承,为什么不能多继承?
|
18天前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
18天前
|
Java
【Java基础面试三十七】、说一说Java的异常机制
这篇文章介绍了Java异常机制的三个主要方面:异常处理(使用try、catch、finally语句)、抛出异常(使用throw和throws关键字)、以及异常跟踪栈(异常传播和程序终止时的栈信息输出)。
|
18天前
|
Java
【Java基础面试三十八】、请介绍Java的异常接口
这篇文章介绍了Java的异常体系结构,主要讲述了Throwable作为异常的顶层父类,以及其子类Error和Exception的区别和处理方式。
下一篇
DDNS