面试题之ElasticSearch

重新自己整理过后的es相关面试题,这里包括八股文和之前面试遇到的问题,后续会持续更新~

1.es的基础知识

  • es的类型定义和mysql的映射关系?
  • es常用数据类型有哪些?
  • es常用方法有哪些?
  • es的分词有哪些?

es的类型定义和mysql的映射关系

es mysql
索引 Index 数据库Database
类型 Type 表table
文档document 数据行row
字段 Field column

es的常用数据类型

  • 字符串类型:包括text和keyword。text(不分词)类型用于全文搜索,而keyword(分词)类型适用于索引结构化内容,如ID、电子邮件地址、主机名、状态码、邮政编码或标签。
  • 数值类型:包括整数、长整数、短整数、字节、双精度浮点数、单精度浮点数、半精度浮点数和缩放浮点数等。这些类型可用于存储不同范围的数值数据。
  • 日期类型:date类型用于存储日期和时间。
  • 布尔类型:boolean类型用于存储真或假值。
  • 二进制类型:binary类型用于存储二进制数据。
  • 范围类型:包括integer_range、float_range、long_range和double_range等,用于存储不同范围的数值数据。
  • 数组类型:ES支持数组字段,可以存储多个值。
  • 对象类型:单个JSON对象,用于存储复杂的数据结构。
  • 嵌套类型:嵌套的JSON对象,用于处理具有复杂关系的JSON数据。
  • Geo-point数据类型:geo_point类型用于存储地理坐标点,如经纬度。
  • Geo-shape数据类型:geo_shape类型用于存储复杂的地理形状,如多边形。
  • IP类型:ip类型用于存储IPv4和IPv6地址。
  • Completion类型:completion类型用于自动完成查询。

es的常用方法

  • 索引创建:使用PUT或POST方法,向ES中添加或更新文档。
   	例如:PUT /index_name/_doc/doc_id {
    "field": "value" }
  • 索引获取:使用GET方法,获取指定索引的信息。
   	例如:GET /index_name
  • 索引删除:使用DELETE方法,删除指定索引。
	例如:DELETE /index_name
  • 文档查询:使用GET方法,查询指定索引中的文档。
	例如:GET /index_name/_search {
    "query": {
    "match": {
    "field": "value" } } }
  • 聚合查询:使用POST方法,对指定索引中的文档进行聚合分析。
	例如:POST /index_name/_search {
   "aggs":{
   "group_by_field":{
   "terms":{
   "field":"field_name"}}}}
  • 高亮显示:使用_highlight字段,在查询结果中高亮显示匹配的文本。
	例如:GET /index_name/_search {
    "highlight": {
    "fields": {
    "field_name":{
   }}}}
  • 排序查询:使用sort参数,对查询结果进行排序。
	例如:GET /index_name/_search {
    "sort": [ {
    "field_name": {
    "order": "asc" }}]}
  • 分页查询:使用from和size参数,对查询结果进行分页。
	例如:GET /index_name/_search {
   "from": 0,"size":10,"query":{
   "match":{
   "field":"value"}}}
  • 更新文档:使用POST或PATCH方法,更新指定索引中的文档。
	例如:POST /index_name/_doc/doc_id/_update {
   "doc":{
   "field":"new_value"}}
  • 删除文档:使用DELETE方法,删除指定索引中的文档。
	例如:DELETE /index_name/_doc/doc_id

es的分词

  • Standard Analyzer:标准分词器,按词切分,小写处理,默认停用词默认是关闭的。
  • Simple Analyzer:按照非字母切分,非字母都会被去除,即只处理字母,小写处理。
  • Whitespace Analyzer:按照空格切分。
  • Keyword Analyzer:不分词,直接将输入的文档当做一个词输出。
  • Pattern Analyzer:通过在空格进行分词的情况下进行正则表达式进行分词,默认是\W+,非字符的符号进行分割;含停用词和小写处理。
  • Language Analyzer:针对不同的语言选择分词,例如english语言分词,会去除词性,如running分词结果为run,- foxes分词结果为fox等;含有停用词处理。
  • IK Analyzer:支持自定义词库,支持热更新分词词典。
  • 问题1:有一个字段是”我爱中国“,我想查中国,能查出来么?
    答:如果没有分词器,查不出来
  • 问题2:我有一个自定义的中文词库,能导入么?
    答:可以,IK词库支持自定义词库。
  • 英文是默认空格分词的

2. es的集群、节点、分片、副本分片的定义?

在这里插入图片描述

在这里插入图片描述

集群有多个节点,一个节点正常来说部署一个分片(容灾考虑),当然也可以部署多个分片,每个分片都会有副本分片(当然也可以没有),每个分片是由多个分段组成。每个分片都只为一个索引服务,比如上边的分片12只为索引1服务。

集群:节点通过设置集群名称,在同一网络中发现具有相同集群名称的节点,组成集群。每个集群都有一个 cluster name 作为标识,默认的集群名称为 elasticsearch。如果在同一网络中只有一个节点,则这个节点成为一个单节点集群。

集群状态

  • Green:所有主分片和从分片都准备就绪(分配成功),即使有一台机器挂了(假设一台机器一个实例),数据都不会丢失,但会变成 Yellow 状态。
  • Yellow:所有主分片准备就绪,但存在至少一个主分片(假设是 A)对应的从分片没有就绪,此时集群属于警告状态,意味着集群高可用和容灾能力下降,如果刚好 A 所在的机器挂了,而从分片还处于未就绪状态,那么 A 的数据就会丢失(查询结果不完整),此时集群进入 Red 状态。
  • Red:至少有一个主分片没有就绪(直接原因是找不到对应的从分片成为新的主分片),此时查询的结果会出现数据丢失(不完整)。

节点:一个 ES 节点就是一个运行的 ES 实例,可以实现数据存储并且搜索的功能。每个节点都有一个唯一的名称作为身份标识,如果没有设置名称,默认使用 UUID 作为名称。最好给每个节点都定义上有意义的名称,在集群中区分出各个节点。

节点类型

  • master 节点: 集群中的一个节点会被选为 master 节点,它将负责管理集群范畴的变更,例如创建或删除索引,添加节点到集群或从集群中删除节点。master 节点无需参与文档层面的变更和搜索,这意味着仅有一个 master 节点并不会因流量增长而成为瓶颈。任意一个节点都可以成为 master 节点。
  • data 节点: 持有数据和倒排索引。默认情况下,每个节点都可以通过设定配置文件 elasticsearch.yml 中的 node.data 属性为 true (默认) 成为数据节点。如果需要一个专门的主节点 (一个节点既可以是 master 节点,同时也可以是 data 节点),应将其 node.data 属性设置为 false。
  • client 节点: 如果将 node.master 属性和 node.data 属性都设置为 false,那么该节点就是一个客户端节点,扮演一个负载均衡的角色,将到来的请求路由到集群中的各个节点。
    一个机器可以有多个实例,所以并不能说一台机器就是一个 node,大多数情况下每个 node 运行在一个独立的环境或虚拟机上。

分片(shard):分为主分片和副本分片

  • 单个节点由于物理机硬件限制,存储的文档是有限的,如果一个索引包含海量文档,则不能在单个节点存储。ES 提供分片机制,同一个索引可以存储在不同分片(数据容器)中。
  • 分片分为主分片 (primary shard) 以及从分片 (replica shard)。主分片会被尽可能平均地 (rebalance) 分配在不同的节点上(例如你有 2 个节点,4 个主分片(不考虑备份),那么每个节点会分到 2 个分片,后来你增加了 2 个节点,那么你这 4 个节点上都会有 1 个分片,这个过程叫 relocation,ES 感知后自动完成)。
  • 从分片只是主分片的一个副本,它用于提供数据的冗余副本,从分片和主分片不会出现在同一个节点上(防止单点故障),默认情况下一个索引创建 5 个主分片,每个主分片会有一个从分片 (5 primary + 5 replica = 10 个分片)。如果你只有一个节点,那么 5 个 replica 都无法被分配 (unassigned),此时 cluster status 会变成 Yellow。
  • 分片是独立的,对
  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值