草庐IT

Elasticsearch 入门篇

java丶猿 2023-10-15 原文

一,概述

  1. Elasticsearch是一个基于Lucene开发的一个分布式、可扩展、实时的搜索与数据分析引擎。
  2. Cluster:集群。
  3. Node:节点,一个节点就是Elasticsearch的一个实例。
  4. Shard:分片(主分片),es数据存储的最小单元,创建索引的时候指定,不可更改,路由算法:shard = hash(routing) % number_of_primary_shards。Routing默认是文档id。
  5. Replica:副本,一个副本就是一个主分片的拷贝,可以动态扩展,提高容灾能力,分担主分片查询压力。
  6. Index:Elasticsearch的Index相当于数据库的Table。
  7. Type:这个在新的7.X版本已经废除。
  8. Document:Document相当于数据库的一行记录。
  9. Field:相当于数据库的Column的概念。
  10. Mapping:索引的数据结构,定义索引里字段的名称,类型,是否分词等。相当于数据库的Schema的概念,描述数据库的组织和结构。

二,数据类型

  1.  常见类型: keyword,text,boolean,integer,long,double,date
  2. 复杂类型: object(JSON对象)、join(嵌套类型)
  3. 特殊类型: geo_point(经纬度"location": { "lat": 41.12, "lon": -71.34})
  4. keyword:
  5.    1,作为整体不被分词,直接建立索引
  6.     2,支持模糊查询(使用wildcard query 类似mysql的like *小*)和精准匹配
  7.     3,这个类型的字段通常用于排序,聚合,
  8. text:
  9.     1,会进行分词,分词后建立索引(对分词建立索引而不是整个文本)
  10.     2,支持模糊,支持精准匹配
  11.     3,不支持聚合查询。

 三,分词器

  1. standard: ES的默认分词器,会去除符号,并将大写转换为小写,然后根据空格进行分词。
  2. simple: 按照非字母切分(符号被过滤),小写处理,会去除数字
  3. whitespace:分词器只根据空格进行分词,保留符号
  4. stop:与standard相似,只是会过滤掉the,a,is等修饰词
  5. keyword: 不分词,将内容当成一个整体
  6. ik_smart: 最粗粒度的分词
  7. Ik_max_word: 最细粒度的分词
     

 四,Node节点类型

  1. Master Node:主节点的主要职责是负责集群层面的相关操作,创建或删除索引,创建Mapping,或者增加、删除节点。单一职责Master节点只需要较低配置CPU、较低配置内存和磁盘。
  2. Data Node:数据节点,主要是存储数据的节点。需要存储数据并计算结果,所以需要高速大容量磁盘、高CPU、高RAM内存。
  3. Ingest Node:数据预处理的节点,对索引请求进行预处理,比如doc写入文件前执行一条ingest pipeline(一个预处理管道),比如改变某个field的值,添加一两个field等 ,还支持painless脚本对数据进行复杂加工(类似于Java中的过滤器)。每个节点默认都是Ingest Node
  4. Coordinating Node:协调节点, 接收到客户端请求之后将创建(删除)索引的请求转发给Master节点,查询数据的请求转发给Data节点,对Data节点返回的数据进行缩减合并返回用户。需要高CPU和中等大小内存。
  5. ES的默认值:node.master=true,node.data=true, node.ingest=true。如果三项都设置为false,那这个节点将只作为协调节点使用。
     

五,分片 Shard

  1. 一个索引的数据可以分为多个主分片,每个主分片又可以设置多个副本分片冗余数据。
  2. 主分片(primary shard)和副本分片(replica shard)
  • 一个索引的主分片数量是在创建索引的时候固定的,不可变更,副本分片是可以动态修改的。主分片故障时副本分片会选出主分片,由此做到冗余数据,容灾。
  • 主副分片都会处理查询请求,协调节点会随机选取主副分片其中一个发送请求。新增修改删除请求只能主分片处理,然后通过主从同步到副本分片。
  • 同一个索引的primary shard、replica shard不能分配到同一个节点上。主要目的是防止节点挂掉导致备份不可用,
  • 写操作时由协调节点发给主分片primary shard,主分片需要将所有操作发送给副本分片执行,全部执行完之后主分片返回给协调节点结果响应给客户端。

六,节点分片示意图

七,分段 Segment

  1. Elasticsearch 中的一个 Shard 是一个 Lucene 索引,一个 Lucene 索引被分解成段。段是存储索引数据的索引中的内部存储元素。
  2. segment是不可变的,物理上你并不能从中删除信息,所以在删除文档的时候,是在文档上面打上一个删除的标记,然后在执行段合并的时候,进行删除
  3. 索引segment段的个数越多,搜索性能越低且消耗内存更多

 八,基于Segment数据读写,更新过程

  1. 新增:当有新的数据需要创建索引时,由于段不变性,所以选择新建一个段来存储新增的数据。
  2. 删除:当需要删除数据时,由于数据所在的段只可读,不可写,所以Lucene在索引文件新增一个.del的文件,用来专门存储被删除的数据id。当查询时,被删除的数据还是可以被查到的,只是在进行文档链表合并时,才把已经删除的数据过滤掉。被删除的数据在进行段合并时才会被真正被移除。索引segment段的个数越多,搜索性能越低且消耗内存更多
  3. 更新:更新的操作其实就是删除和新增的组合,先在.del文件中记录旧数据,再在新段中添加一条更新后的数据。
     

 九,倒排索引数据结构

  1. Term(单词):一段文本经过分析器分析以后就会输出一串单词,这一个一个的就叫做Term(直译为:单词)
  2. Term Dictionary(单词字典):可以理解为Term的集合,ES为了快速找到term,会将所有term排序,然后二分查找。
  3. Term Index(单词索引):为了更快的找到某个单词,我们为单词建立索引,结构类似“Trie 树”(前缀树/字典树)
  4. Posting List(倒排列表):倒排列表存储的是单词对应的文档id,还可以保存单词在某个文档中出现的次数,单词在文档中出现的位置

 十,倒排索引

  1. 单词的倒排索引如下图
  2. 文档频率:该单词在多少文档中出现过
  3. DocId:单词出现的文档ID
  4. TF:表示单词在该文档中出现次数
  5. <POS>:表示单词出现的位置信息

 十一,整体结构示意图

 十二,单词查找过程

通过term index可以快速地定位到term dictionary的某个offset,然后从这个位置再往后顺序查找,确定term的在磁盘中的位置,找到单词对应的倒排项。
注:term index是通过FST (Finite State Transducer)的压缩技术进行压缩,保证term index可以被缓存到内存中,减少磁盘IO,提高效率。
FST有两个优点:1)空间占用小。通过对词典中单词前缀和后缀的重复利用,压缩了存储空间;2)查询速度快。O(len(str))的查询时间复杂度。

 十三,ES数据写入过程

  1. 客户端向 Node 1 发送新建、索引或者删除请求。
  2. 节点使用文档的 _id 确定文档属于分片 0 。请求会被转发到 Node 3,因为分片 0 的主分片目前被分配在 Node 3 上。
  3. Node 3 在主分片上面执行请求。如果成功了,它将请求并行转发到 Node 1 和 Node 2 的副本分片上。一旦所有的副本分片都报告成功, Node 3 将向协调节点报告成功,协调节点向客户端报告成功。

 十四,ES数据读取数据过程-查询阶段

  1. 客户端发送查询请求到node3,node3此时作为协调节点。
  2. node3以广播请求的方式请求索引中每一个节点的分片(可以是主分片也可以是副本分片)
  3. 每个分片将构造一个本地优先队列。如果客户端要求返回的是from,size分页数据,则每个分片都会得到一个form+size大小的结果集,将轻量级的结果返回给协调节点,由node3进行合并排序。

 十五,ES数据读取数据过程-取回阶段

  1. 协调节点node3,根据合并后的结果集,确定需要向那些分片发起请求。
  2. 向各个分片发起请求,获取到文档完整数据返回给协调节点。
  3. 协调节点返回给客户端

 十六,ES数据存储过程

1,一个文档被索引之后,就会被添加到内存缓冲区,并且 追加到了 translog

 2,分片每秒执行一次refersh,这些在内存缓冲区的文档被写入到一个新的segment中, 
   segment被打开,文档可被索引到,同时清空内存buffer

 3,这个进程继续工作,更多的文档被添加到内存缓冲区和追加到translog

 4,每间隔一段时间,或translog变得越来越大索引将被flush
     1)内存缓冲区的数据被写入新的segment
    2)缓冲区被清空
    3)文件系统缓存被刷入磁盘(flush操作)
    4)清空translog

 

 十七,ES数据存储原理

 

十八,基本语法


查看索引信息:GET /_cat/indices?v

查看集群节点信息:GET /_cat/nodes

删除索引:DELETE /my_index

创建索引: PUT /my_index?pretty

{
    "settings":{
        "number_of_shards":3,
        "number_of_replicas":1
    }
}

设置索引信息:PUT /my_index/_mappings
keyword 类型 ignore_above 指的是长度超过指定字符后,不会被索引,但是会被存储
text  类型的 ignore_above 指超过长度不能被整体索引,不会精确匹配到

{
    "properties": {
        "content_type": {
            "type": "integer"
        },
        "content_id": {
            "type": "long"
        },
        "user_name": {
            "type": "keyword",
            "ignore_above": 5
        },
        "title": {
            "type": "text",
            "fields": {
                "key": {
                    "type": "keyword",
                    "ignore_above": 15
                }
            },
            "analyzer": "ik_smart",
            "search_analyzer": "ik_smart"
        },
        "desc": {
            "type": "text",
            "analyzer": "ik_smart",
            "search_analyzer": "ik_smart"
        },
        "create_time": {
            "type": "date"
        }
    }
}

查看索引结构信息:GET /my_index

查看索引结构信息:GET /my_index/_mappings

删除文档:DELETE /my_index/_doc/1

创建文档:PUT /my_index/_doc/1001

{
    "content_id": 1001,
    "content_type": 1,
    "user_name": "小明",
    "create_time": "2020-11-01",
    "title": "一则小明的花边新闻",
    "desc": "小明昨天表白失败"
}
{
    "content_id": 1002,
    "content_type": 1,
    "user_name": "小红",
    "create_time": "2020-11-01",
    "title": "小红花边新闻",
    "desc": "小红昨天拒绝了小明的表白"
}
{
    "content_id": 1003,
    "content_type": 2,
    "user_name": "小胡",
    "create_time": "2020-11-02",
    "title": "小红和小胡的感情纠葛",
    "desc": "小红因为暗恋小胡拒绝了小明的追求"
}
{
    "content_id": 1004,
    "content_type": 2,
    "user_name": "小红小明小胡",
    "create_time": "2020-11-02",
    "title": "小红小明小胡的生死三角恋导致的诸多问题引发社会关心",
    "desc": "小红因为暗恋老王拒绝了小明的追求"
}

term 对搜索词不做分词,会将输入作为一个整体,在倒排索引中查找准确的词项:GET /my_index/_search

{
  "query": {
    "term": {
      "user_name": "小胡"
    }
  }
}
{
  "query": {
    "term": {
      "title": "小红"
    }
  }
}

match 用在一个分词字段上,他会分词去匹配。用在一个精确匹配的字段上或者数字、日期类型字段上他会精确查找:GET /my_index/_search

{
  "query": {
    "match": {
      "user_name": "小红"
    }
  }
}


加上分页

{
  "query": {
    "match": {
      "title": "小红和"
    }
  },
  "from":0,
  "size":"1"
}

range 范围查询:GET /my_index/_search

{
  "query": {
    "range": {
      "content_id": {
          "gte":1002,
          "lte":1004
      }
    }
  }
}

bool 多条件组合查询:GET /my_index/_search

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "title": "小胡"
                    }
                },
                {
                    "range": {
                        "content_id": {
                            "gte": 1002,
                            "lte": 1004
                        }
                    }
                }
            ]
        }
    }
}


 

有关Elasticsearch 入门篇的更多相关文章

  1. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  2. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  3. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  4. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  5. ruby - Rails Elasticsearch 聚合 - 2

    不知何故,我似乎无法获得包含我的聚合的响应...使用curl它按预期工作:HBZUMB01$curl-XPOST"http://localhost:9200/contents/_search"-d'{"size":0,"aggs":{"sport_count":{"value_count":{"field":"dwid"}}}}'我收到回复:{"took":4,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":90,"max_score":0.0,"hits":[]},"a

  6. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

  7. elasticsearch源码关于TransportSearchAction【阶段三】 - 2

    1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>

  8. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  9. Simulink方法总结和避坑指南(一)——Simulink入门与基本调试方法 - 2

    文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景  最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。  在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记

  10. ruby-on-rails - 使用 Rails (Tire) 和 ElasticSearch 进行模糊字符串匹配 - 2

    我有一个Rails应用程序,现在设置了ElasticSearch和Tiregem以在模型上进行搜索,我想知道我应该如何设置我的应用程序以对模型中的某些索引进行模糊字符串匹配。我将我的模型设置为索引标题、描述等内容,但我想对其中一些进行模糊字符串匹配,但我不确定在何处进行此操作。如果您想发表评论,我将在下面包含我的代码!谢谢!在Controller中:defsearch@resource=Resource.search(params[:q],:page=>(params[:page]||1),:per_page=>15,load:true)end在模型中:classResource'Us

随机推荐