iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >ElasticSearch节点、分片、CRUD、倒排索引和分词源码分析
  • 785
分享到

ElasticSearch节点、分片、CRUD、倒排索引和分词源码分析

2023-07-05 16:07:20 785人浏览 八月长安
摘要

这篇文章主要介绍了elasticsearch节点、分片、CRUD、倒排索引和分词源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇ElasticSearch节点、分片、CRUD、倒排索引和分词源码分析文章都

这篇文章主要介绍了elasticsearch节点、分片、CRUD、倒排索引和分词源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇ElasticSearch节点、分片、CRUD、倒排索引和分词源码分析文章都会有所收获,下面我们一起来看看吧。

ElasticSearch

ElasticSearch是非常重要的检索工具,利用分词、索引(倒排索引)、分词从众多检索工具中脱颖而出。

基本概念:索引、文档和REST api

ElasticSearch是面向文档的,文档是所有可搜索数据的最小单位

  • 日志文件中的日志项

  • 一本电影的具体信息 / 一张唱片的详细信息

  • Mp3播放器的一首歌 / 一篇pdf文档中的具体内容

文档会被序列化成Josn格式,保存在ElasticSearch中

  • JSON对象由字段组成

  • 每个字段都有对应的字段类型(字符串/数值/布尔/日期/二进制/范围类型)

每个文档都有一个UniqueID

你可以自己指定ID

或者通过ElasticSearch自动生成

json文档

  • 一篇文档包含了一系列的字段

  • Json文档,格式灵活,不需要预先定义格式

    • 字段的类型可以指定或通过ElasticSearch自动推算

    • 支持数组、支持嵌套

文档的元数据

{    "_index" : ".kibana_1",    "_type" : "_doc",    "_id" : "space:default",    "_score" : 1.0,    "_source" : {        "space" : {        "name" : "默认值",        "description" : "这是您的默认空间!",        "color" : "#00bfb3",        "_reserved" : true        },        "type" : "space",        "references" : [ ],        "updated_at" : "2022-05-13T09:16:16.465Z"    }}
  • 元数据,用于标注文档的相关信息

    • _index : 文档所属的索引名

    • _type : 文档所属的类型名

    • _id : 文档唯一ID

    • _source : 文档的原始Json数据

    • _version : 文档的版本信息

    • _score : 相关性打分

索引

  • index :索引是文档的容器,是一类文档的结合

    • index体现了逻辑空间的概念,每个索引都有自己的Mapping定义,用于定义包含的文档的字段名和字段类型

    • Shard 体现了物理空间的概念,索引中的数据分散在Shard上

  • 索引的Mapping与Settings

    • Mapping定义文档的字段类型

    • Setting定义不同的数据分布

//查看索引相关信息GET kibana_sample_data_ecommerce//查看索引的文档总数GET kibana_sample_data_ecommerce/_count//查看前10条文档,了解文档格式POST kibana_sample_data_ecommerce/_search{}//_cat indices API//查看indicesGET /_cat/indices/kibana*?v&s=index//查看状态为绿的索引GET /_cat/indices?v&health=green//按照文档个数排序GET /_cat/indices?v&s=docs.count:desc//查看具体的字段GET /_cat/indices/kibana*?pri&v&h=health,index,pri,rep,docs.count,mt//How much memory is used per index?GET /_cat/indices?v&h=i,tm&s=tm:desc

分布式系统的可用性和扩展性

  • 高可用

    • 服务可用性 :允许有节点停止服务

    • 数据可用性 :部分节点丢失,不会丢失数据

  • 可扩展性

    • 请求量提升 / 数据的不断增长(将数据分布都所有接点上)

分布式特性

  • elasticsearch的分布式架构的好处

    • 存储的水平扩容

    • 提高系统的可用性,部分节点停止服务,整个集群的服务不受影响

  • elasticsearch的分布式架构

    • 不同的集群通过不同的名字来区分,默认名字"elasticsearch"

    • 通过配置文件修改,或者在命令行中-E cluster.name=stark进行设定

    • 一个集群可以有一个或多个节点

节点

  • 节点是elasticsearch的实例

    • 本质上就是一个Java进程

    • 一台机器上可以运行多个elasticsearch进程,但是生产环境一般建议一台机器上只运行一个elasticsearch实例

  • 每一个节点都有名字,通过配置文件配置,或者启动的时候-E node.name=node1指定

  • 每一个节点在启动之后,会分配一个UID,保存在data目录下

分片

  • 主分片,用以解决数据水平扩展的问题。通过主分片,可以将数据分布到集群内的所有节点之上

    • 一个分片是一个运行的Lucene的实例

    • 主分片数在索引创建时指定,后续不允许修改,除非Reindex

  • 副本 ,用以解决数据高可用的问题,分片是主分片的拷贝

    • 副本分片数,可以动态调整

    • 增加副本数,还可以在一定程度上提高服务的可用性

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

查看集群的健康状况

  • Green - 主分片与副本都正常分配

  • Yellow - 主分片全部正常分配,有副本分片未能正常分片

  • Red - 有主分片未能分配

CRUD

使用PostMan创建一个名字叫stark的索引

Http://127.0.0.1:9200/stark?pretty// 返回值{    "acknowledged": true,    "shards_acknowledged": true,    "index": "stark"}

文档的CRUD

  • Type名,约定都用_doc

  • Create ,如果ID已经存在,会失败

  • Index ,如果ID不存在,创建新的文档。否则先删除现有文档,再创建新的文档,版本会增加。

  • Update ,文档必须已经存在,更新只会对相应字段做增量修改。

Create 一个文档

支持自动生成文档ID和指定文档ID两种方式:

  • 使用POST /indexName/_doc,系统会自动生成Document ID

  • 使用PUT /indexName/_create/ID创建时,URI中显示指定_create,此时如果该ID的文档已经存在,操作失败

GET 一个文档

GET http://127.0.0.1:9200/IndexName/_doc/ID

  • 找到文档,返回Http 200

    • 文档元信息,同一个ID的文档,即使被删除,Version号也会不断增加

    • _source 中默认包含了文档的所有原始信息

  • 找不到文档,返回Http 404

Index 文档

PUT IndexName/_doc/1{    "tags":["name","age","sex"]}

Index和Create不一样的地方:如果文档存在,就索引新的文档。否则现有文档会被删除,新的文档被索引,版本信息(Version) + 1。

Update 文档

Update方法不会删除原来的文档,而是实现真正的数据更新,POST方法 ,Payload需要包含在doc中。

POST IndexNmae/_update/1{    "doc":{        "albums":["aaa","bbb"]    }}

删除文档

DELETE IndexName/_doc/ID

Bulk API / 批量读取 mGet / 批量查询 msearch

Bulk Api 支持在一次Api调用中,对不同的索引进行操作,支持四种类型操作,Index\Create\Update\Delete。

可以在URI中指定Index,也可以在请求的Payload中进行,操作单挑操作失败,并不影响其他操作,返回结果包括了每一条操作执行的结果。

//对同一个索引进行操作POST /IndexName/_doc/_bulk //对不同的索引进行操作POST _bulk{ "index" : { "_index" : "test", "_id" : "1" } }{ "field1" : "value1" }{ "delete" : { "_index" : "test", "_id" : "2" } }{ "create" : { "_index" : "test2", "_id" : "3" } }{ "field1" : "value3" }{ "update" : {"_id" : "1", "_index" : "test"} }{ "doc" : {"field2" : "value2"} }

mGet批量操作,可以减少网络链接所产生的开销,提高性能。

#URI中指定indexGET /IndxName/_mget{    "docs" : [        {            "_id" : "1"        },        {            "_id" : "2"        }    ]}//对不同的索引进行操作GET /_mget{    "docs" : [        {            "_index" : "test",            "_id" : "1"        },        {            "_index" : "test",            "_id" : "2"        }    ]}

批量查询 msearch

// msearch 操作POST kibana_sample_data_ecommerce/_msearch{"query" : {"match_all" : {}},"size":1}{"index" : "kibana_sample_data_flights"}{"query" : {"match_all" : {}},"size":2}

倒排索引

倒排索引的核心组成

  • 倒排索引包含两个部分

    • 倒排索引项

    • 文档ID

    • 词频TF - 该单词在文档中出现的次数,用于相关性评分

    • 位置,单词在文档中分词的位置,用于语句搜索

    • 偏移,记录单词的开始结束位置,实现高亮显示

    • 单词词典一般比较大,可以通过B+树或哈希拉链法实现,以满足高性能的插入和查询

    • 单词词典,记录所有文档的单词,记录单词到倒排列表的关联关系

    • 倒排列表,记录了单词对应的文档结合,由倒排索引组成

Es的倒排索引

  • Es的Json文档中的每个字段,都有自己的倒排索引

  • 可以指定对某些字段不做索引

    • 优点:节省存储空间

    • 缺点:字段无法被搜索

Analysis 与 Analyzer

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

  • Analysis 是通过 Analyzer 来实现的,可使用elasticsearch内置的分析器 / 或者按需定制化分析器。

  • 除了在数据写入时转换词条,匹配Query语句时候也需要用相同的分析器对查询进行查询语句进行分析。

Analyzer的组成

  • 分词器是专门处理分词的组件,Analyzer由三部分组成:

    • ① 针对原始文本处理,例如去除html

    • ② 按照规则切分单词

    • ③ 将切分的单词进行加工,小写,删除stopworlds,增加同义词

Search Api

  • URI Search ,在URL中使用查询参数

  • Request Body Search ,使用es提供的,基于Json格式的更加完备的Query Domain Specific Language(DSL)

指定查询的索引

集群上所有的索引:

GET /_search //集群上所有的索引GET /Index1/_search  //index1GET /Index1,Index2/_search  //index1和index2GET /index*/_search  //以index开头的索引

URI查询

  • 使用"q",指定字符串查询

  • "query string syntax",KV键值对

用q表示查询内容,搜索叫做stark的客户GET /IndexName/_search?q=keyName:stark

Request Body

Request Body 支持 POST/GET两种方法,-H代表的是header参数 -d 代表的是body的请求参数。

curl -XGET "http://127.0.0.1:9200/IndexName/_search"-H 'Content-Type:application/json' -d'{ "query":{     "match_all":{} }    }'

搜索Response

搜索Response有几个关键的描述需要在这里解释一下:

  • took: 花费的时间

  • total: 符合条件的总文档数

  • hits:结果集,默认前10个文档

  • _index:索引名

  • _id:文档的ID

  • _score: 相关度评分

  • _source:文档原始信息

URI Search详解

指定字段查询 Vs 泛查询

q是关键字,df是指定字段,泛查询就是查询所有字段中包含关键字的结果

//指定字段GET /IndexName/_search?q=2020&df=titleGET /IndexName/_search?q=title:2020{    "profile":"true"}//泛查询GET /IndexName/_search?q=2020{    "profile":"true"}

Term Vs Phrase

Hello World 等效于 Hello Or World

"Hello World",等效于Hello AND World 。Phrase查询,还要求前后顺序保持一致

分组和引号

  • title:(Hello AND World)

  • title = "Hello World"

//分组,Bool查询GET /IndexName/_search?q=title:(Hello World){    "profile":"true"}//泛查询GET /IndexName/_search?q=title:Hello World{    "profile":"true"}

布尔操作 、分组

  • 布尔操作

    • 必须大写

    • title:(Hello NOT World)

    • AND / OR / NOT 或者 && / || / !

  • 分组

    • 表示 must_not

    • 表示 must

    • title:(+Hello -World)

//检索title里有Hello ,没有World的词条GET /IndexName/_search?q=title:(Hello NOT World){    "profile":"true"}//检索title里必须有Hello ,必须没有World的词条GET /IndexName/_search?q=title:(+Hello -World){    "profile":"true"}

范围查询 、算术符号

URI Search支持范围查询和算术符号查询。

  • 范围查询

    • 区间表示:[]闭区间,{}开区间

    • year:{2019 TO 2020}

    • year:[* TO 2020]

  • 算数符号

    • year:> 2020

    • year:(>2010 && < 2020)

    • year:(+>2010 && +< 2020)

GET /IndexName/_search?q=year:>2020{    "profile":"true"}

关于“ElasticSearch节点、分片、CRUD、倒排索引和分词源码分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“ElasticSearch节点、分片、CRUD、倒排索引和分词源码分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: ElasticSearch节点、分片、CRUD、倒排索引和分词源码分析

本文链接: https://www.lsjlt.com/news/352958.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c++中int和double有什么区别
    int 和 double 是 c++ 的数据类型,用于表示整数和浮点数。它们的关键区别在于:1. 范围:int 为整数,double 为浮点数且范围更大;2. 存储大小:int 占 4 ...
    99+
    2024-05-14
    c++ 隐式转换
  • C++ 多线程程序测试的挑战和策略
    多线程程序测试面临不可重复性、并发错误、死锁和缺乏可视性等挑战。策略包括:单元测试:针对每个线程编写单元测试,验证线程行为。多线程模拟:使用模拟框架在控制线程调度的情况下测试程序。数据竞...
    99+
    2024-05-14
    c++ 多线程
  • c++中深拷贝和浅拷贝的应用时间
    浅拷贝复制对象指针或引用,仅适用于不含动态分配内存或简单数据结构的对象;深拷贝复制实际数据,包括动态分配内存,适用于包含动态分配内存或复杂数据结构的对象。 浅拷贝和深拷贝的应用时间 在...
    99+
    2024-05-14
    c++
  • 探索用于 C++ 服务器架构的高级数据结构
    在 c++++ 服务器架构中,选择适当的高级数据结构至关重要。哈希表用于快速数据查找,树用于表示数据层次结构,图用于表示对象之间的关系。这些数据结构在实践中有着广泛的应用,例如缓存系统、...
    99+
    2024-05-14
    c++ 数据结构 社交网络 键值对
  • fixed在c++中的作用
    fixed 关键字在 c++ 中用于将浮点数存储为固定小数,提供更高精度,尤其适用于需要高精度的金融计算。fixed 将浮点数表示为具有固定小数位数的小数,默认情况下使用十进制表示法,小...
    99+
    2024-05-14
    c++
  • insert在c++中怎么用
    insert() 函数在 c++ 中用于在容器(如 vector、set)中插入元素,提供了一种动态调整容器大小并添加新元素的方法。它需要两个参数:要插入元素的位置 (pos) 和要插入...
    99+
    2024-05-14
    c++ 标准库
  • 如何使用 Golang 构建 RESTful API 并处理 JSON 响应?
    如何使用 golang 构建和处理 json 响应的 restful api步骤:创建 golang 项目并安装 gorilla mux。定义路由并处理 http 请求。安装 json ...
    99+
    2024-05-14
    golang git
  • c++中int和long的区别
    int 和 long 都是 c++ 中的整型类型,主要区别在于范围和存储空间:范围:int 为 32 位整数,范围为 [-2^31, 2^31-1];long 为 64 位整数,范围为 ...
    99+
    2024-05-14
    c++ 数据丢失
  • c++中int a(n)和int a[n]的区别
    int a(n)声明一个不可变的整型变量,而int a[n]声明一个可修改元素的整型数组,用于存储和处理数据序列或集合。 int a(n) 和 int a[n] 在 C++ 中的区别 ...
    99+
    2024-05-14
    c++
  • C++ 多线程编程中调试和故障排除的技术
    c++++ 多线程编程的调试技巧包括:使用数据竞争分析器检测读写冲突,并使用同步机制(如互斥锁)解决。使用线程调试工具检测死锁,并通过避免嵌套锁和使用死锁检测机制来解决。使用数据竞争分析...
    99+
    2024-05-14
    c++ 多线程 故障排除 同步机制
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作