Elasticsearch学习(2)—— 常见术语

为什么80%的码农都做不了架构师?>>>   hot3.png

cluster (集群):一个或多个拥有同一个集群名称的节点组成了一个集群。每个集群都会自动选出一个主节点,如果该主节点故障,则集群会自动选出新的主节点来替换故障节点。

node (节点):一个节点是集群中的一个 Elasticsearch 运行实例。测试环境,多个节点可以同时启动在同一个服务器上,生产环境一般是一个服务器上一个节点。节点启动时将使用单播或者是组播来发现和自己配置的集群名称相同的集群,并尝试加入到该集群中。

shard (分片):一个分片就是一个Lucene实例,它是 Elasticsearch 管理的底层 「工作单元」。一个索引是逻辑上的一个命名空间,指向主分片和副本分片。索引的主分片和副本分片数量必须明确指定好,在应用代码使用时只需要处理和索引的交互,不会涉及到和分片的交互。Elasticsearch 会在集群中的所有节点上设置好分片,但节点失效或加入新节点时会自动将移动节点分片。

primary shard (主分片):每个文档都会被保存在一个主分片上。当我们索引一个文档时,它将在一个主分片上进行索引,然后才放到该主分片的各副本分片上。默认情况下,一个索引有 5 个主分片。我们可以指定更少或更多的主分片来伸缩索引可处理的文档数。需要注意的是,一旦索引创建,就不能修改主分片个数

replica shard (副本分片):每个主分片可以拥有0个或多个副本分片,一个副本分片是主分片的一份拷贝。这样做有两个主要原因:

  • 故障转移:当主分片失效时,一个副本分片会被提升为主分片。
  • 提高性能:获取与搜索请求可以被主分片或副本分片处理。默认情况下,每个主分片都有一个副本分片,副本分片的数量可以动态调整。在同一个节点上,副本分片和其主分片不会同时运行。

单节点,三个主分片的原理图

两个节点,三个主分片,一个副本分片的原理图

三个节点,三个主分片,两个副本分片

索引中的主分片的数量在索引创建后就固定下来了,但是从分片的数量可以随时改变。

在ES集群中可以监控统计很多信息,其中最重要的就是:集群健康(cluster health)。它的 status 有 green、yellow、red 三种;

status意义
green所有主分片和从分片都可用
yellow所有主分片可用,但存在不可用的从分片
red存在不可用的主要分片

index (索引)一个索引类似关系型数据库中的一个数据库,它可以映射为多种type。一个索引就是逻辑上的一个命名空间,对应到1或多个主分片上,可以拥有0个或多个副本分片。

type (类型):表示一类相似的document。Type由名称(如orderinfo,refundinfo)和mapping组成。类似于数据库中的schema,描述了文档可能具有的字段或属性 、每个字段的数据类型—比如 string, integer 或 date — 以及Lucene是如何索引和存储这些字段的。类型可以很好的抽象划分相似但不相同的数据。每个document的类型名被存储在一个叫 _type 的元数据字段上

id:id 是用于标识文档的。文档 id 是自动生成的,如果显式不指定。

document (文档):一个文档就是一个保存在 Elasticsearch 中的 JSON 文本,可以把它理解为关系型数据库表中的一行。每个文档都是保存在索引中的,拥有一种type和 id。一个文档是一个 JSON Object (一些语言中的 hash / hashmap / associative array) 包含了 0 或多个field (键值对)。原始的 JSON 文本在索引后将被保存在 _source字段里,搜索完成后返回值中默认是包含该字段的。

document举例:
{
  "_index": "test_index",
  "_type": "test_type",
  "_id": "1",
  "_version": 1,
  "_source": {
    "test_field1": "test field1",
    "test_field2": "test field2"
  }
}

一个document不只包含了数据。它还包含了元数据(metadata) —— 关于文档的信息。有三个元数据元素是必须存在的,它们是:

名字说明
_index文档存储的地方
_type文档代表的对象种类
_id文档的唯一编号
文档通过 _index, _type以及_id来确定它的唯一性。
其余可选的元数据类型:
名字说明
_uid组合id,由_type和_id组成
_source文档的原始json数据,可以从这里获取每个字段的内容
_all整合所有字段内容到该字段,默认禁用

source field ( 源字段):默认情况下,在获取和搜索请求返回值中的 _source字段保存了 JSON 文本。这使得我们可以直接在返回结果中访问源数据,而不需要根据 id 再发一次检索请求。索引的 JSON 字符串将完整返回,无论是否是一个合法的 JSON。该字段的内容也不会描述数据如何被索引。

field (字段):一个文档包含了若干字段,或称之为键值对字段的值可以是简单标量值,例如字符串、整型、日期,也可以是嵌套结构,例如数组或对象。一个字段类似于关系型数据库表中的一列。每个字段的映射都有一个字段类型 ( 不要和文档类型搞混了 ),它描述了这个字段可以保存的值类型,例如整型、字符串、对象。mapping还可以让我们定义一个字段的值如何进行分析

字段类型:

一级分类二级分类具体类型
核心类型字符串类型string,text,keyword
整数类型integer,long,short,byte
浮点类型double,float,half_float,scaled_float
逻辑类型boolean
日期类型date
范围类型range
二进制类型binary
复合类型数组类型array
对象类型object
嵌套类型nested
地理类型地理坐标类型geo_point
地理地图geo_shape
特殊类型IP类型ip
范围类型completion
令牌计数类型token_count
附件类型attachment
抽取类型percolator

mapping (映射):就像数据库中的schema描述了文档可能具有的字段或属性,每个字段的数据类型以及Lucene是如何索引和存储这些字段的。Elasticsearch的mapping一旦创建,只能增加字段,而不能修改已经mapping的字段。修改mapping只能通过重新建立一个index,然后创建一个新的mapping。

设置mapping

POST /library                  #给索引为library创建映射关系

{

     "settings":{//分片的设置

     "number_of_shards" : 5,

     "number_of_replicas" : 1

      },

      "mappings":{

            "books":{          #索引为library的type类型为books

                "properties":{        #这里往下就是映射关系

                    "title":{"type":"string"},

                    "name":{"type":"string","index":"not_analyzed"},

                    "publish_date":{"type":"date","index":"not_analyzed"},

                    "price":{"type":"double"},

                    "number":{

                        "type":"object",

                        "dynamic":true

                     }

                  }

               }

         }

}

获取mapping

GET library/_mapping

{
   "library": {
      "mappings": {
         "books": {
            "properties": {
               "name": {
                  "type": "string",
                  "index": "not_analyzed"
               },
               "number": {
                  "type": "object",
                  "dynamic": "true"
               },
               "price": {
                  "type": "double"
               },
               "publish_date": {
                  "type": "date",
                  "format": "dateOptionalTime"
               },
               "title": {
                  "type": "string"
               }
            }
         }
      }
   }
}

term (查询词):一个查询词是一个被 Elasticsearch 索引的确切值。查询词 foo,Foo,FOO 是不同的。查询词可以使用查询词查询接口进行获取。

"query": {
    "term": {
      "age": "39"
    }
  }

类似的terms

 "query" : {
        "constant_score" : {
            "filter" : {
                "terms" : {
                    "price" : [20, 30]
                }
            }
        }
    }

analysis 分析:分析是将文本 ( text ) 转化为查询词 ( term ) 的过程。比如这三种短语:FOO BAR,Foo-Bar,foo,bar 都有可能被分解成查询词 foo 与 bar。可以使用不同的分析器,这些查询词实际上将被存储在索引中。一次对 FoO:bAR 的全文查询 ( 不是查询词查询 ) 可能会被分析为为查询词 foo,bar,可以匹配上保存在索引中的查询词。这就是分析处理过程(包含了索引与搜索),它使得 es 可以进行全文查询。

routing (路由):当我们索引一个document时,它将被保存在一个主分片上,分片的选择是通过路由值哈希得到的。默认情况下,路由值使用文档的 id,如果该文档指定了父文档,则路由值使用父文档 id。这是为了确保子文档和父文档被保存在相同的分片上。该值可以在索引时指定,也可以通过映射路由字段来指定。

当你索引一个文档,它被存储在单独一个主分片上。Elasticsearch是如何知道文档属于哪个分片的呢?当你创建一个新文档,它是如何知道是应该存储在分片1还是分片2上的呢?

进程不能是随机的,因为我们将来要索引文档。事实上,它根据一个简单的算法决定:

shard = hash(_routing) % number_of_primary_shards

_routing值是一个任意字符串,它默认是_id但也可以自定义。这个_routing字符串通过哈希函数生成一个数字,然后除以主分片的数量得到一个余数(remainder),余数的范围永远是0number_of_primary_shards - 1这个数字就是特定文档所在的分片

=============================================================================

与数据库概念的映射关系:

Elasticsearch

RDBMS

Elasticsearch

Relational DB

Indices(索引)

Databases

Types(类型)

Tables

Documents(文档)

Rows

Fields(字段)

Columns

转载于:https://my.oschina.net/liyurong/blog/1841888

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

67. 二进制求和

67. 二进制求和 给你两个二进制字符串,返回它们的和(用二进制表示)。 输入为 非空 字符串且只包含数字 1 和 0。 示例 1: 输入: a “11”, b “1” 输出: “100” 示例 2: 输入: a “1010”, b “1011” 输出: “10101” 提示&…

前端开发有哪些技术栈要掌握_为什么要掌握前端开发的这四个主要概念

前端开发有哪些技术栈要掌握After working as a front-end developer for three years, I have been able to summarize what I feel are the four major concepts of front-end development. Knowing and studying these four areas will make you stand out from the crowd.在…

python中的序列化与反序列化

之前,在学习python时,一直弄不明白pickle和json模块的序列化和反序例化之间的区别和用法,最近闲来有时间,重新研究了这两个模块,也算是基本搞明白他们之中的区别了。 用于序列化的两个模块, json&#xff0…

1114. 按序打印

1114. 按序打印 我们提供了一个类: public class Foo { public void first() { print(“first”); } public void second() { print(“second”); } public void third() { print(“third”); } } 三个不同的线程 A、B、C 将会共用一个 Foo 实例。 一个将会调用 …

2018年应用交付控制器市场将发生重大变化

应用交付控制器(ADC)一直以来都是基础设施的关键部分。它们位于应用程序和基础架构之间,是唯一可以同时使用应用程序和网络语言的技术。IT行业正在经历一个快速的现代化进程,包含诸如软件定义的网络、云、容器等其他计划对基础设施…

如何测试一个水杯

关于一个水杯如何测试?这个被认为是测试界最为经验的面试题了,下面是我的回答思路: 对于一个软件的测试,重点是测试的思路以及测试的全面性的体现。 软件测试应该先重点再次重点,对于软件而言重点自然在于功能测试&…

1115. 交替打印FooBar

1115. 交替打印FooBar 我们提供一个类&#xff1a; class FooBar {public void foo() {for (int i 0; i < n; i) {print("foo");}}public void bar() {for (int i 0; i < n; i) {print("bar");}} }两个不同的线程将会共用一个 FooBar 实例。其中…

IntelliJ IDEA 运行 Maven 项目

1.官方文档说IntelliJ IDEA已经自身集成了maven&#xff0c;则不用劳心去下载maven 2.导入一个程序&#xff0c;看是否是maven程序的关键在于工程之中有没有pom.xml这个文件&#xff0c;比如这里 3.为这个工程配置好服务器3.1 点击“Edit Configurations”3.2 进入Run/Debug C…

资深老鸟整理,Java接口自动化测试总结,从0到1自动化...

这几年接口自动化变得越来越热门&#xff0c;相对比于UI自动化&#xff0c;接口自动化有一些优势 1&#xff09;运行比UI更稳定&#xff0c;让BUG更容易定位 2&#xff09;UI自动化维护成本太高&#xff0c;接口相对低一些 接口测试其实有很多方式&#xff0c;主要有两种&…

parcel react_如何使用Parcel设置React应用

parcel reactFor a long time Webpack was one of the biggest barriers-to-entry for someone wanting to learn React. Theres a lot of boilerplate configuration that can be confusing, especially if youre new to React. 长期以来&#xff0c; Webpack一直是想要学习Re…

1117. H2O 生成

1117. H2O 生成 现在有两种线程&#xff0c;氧 oxygen 和氢 hydrogen&#xff0c;你的目标是组织这两种线程来产生水分子。 存在一个屏障&#xff08;barrier&#xff09;使得每个线程必须等候直到一个完整水分子能够被产生出来。 氢和氧线程会被分别给予 releaseHydrogen 和…

pdf 字体和图片抽取

2019独角兽企业重金招聘Python工程师标准>>> #安装mutoos sudo apt-get install mupdf-tools #抽取字体 mutool extract LTN20180531052_C.pdf 转载于:https://my.oschina.net/colin86/blog/1842412

推箱子2-向右推!_保持冷静,砍箱子-银行

推箱子2-向右推!Hack The Box (HTB) is an online platform allowing you to test your penetration testing skills. It contains several challenges that are constantly updated. Some of them are simulating real world scenarios and some of them lean more towards a …

611. 有效三角形的个数

611. 有效三角形的个数 给定一个包含非负整数的数组&#xff0c;你的任务是统计其中可以组成三角形三条边的三元组个数。 示例 1: 输入: [2,2,3,4] 输出: 3 解释: 有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3注意: 数组长度不超过1000。数组里整数的范…

python学习day04

一&#xff1a;今天是一个学习列表后的实践训练 购物小程序&#xff1a; #codeing:UTF-8 #__author__:Duke #date:2018/3/1/001product_list [(mac,7000),(bike,1000),(phone,2000),(kindle,800),(iwatch,3000), ]; shopping_car []; saving input("please input your …

mybatis多产数_freeCodeCamp杰出贡献者–我们如何选择,认可和奖励多产的志愿者

mybatis多产数freeCodeCamp.org is only possible thanks to the thousands of contributors around the world who help expand and improve the community. They do this mainly through:感谢全球各地成千上万的贡献者&#xff0c;他们致力于扩大和改善社区&#xff0c;因此f…

502. IPO

502. IPO 假设 力扣&#xff08;LeetCode&#xff09;即将开始 IPO 。为了以更高的价格将股票卖给风险投资公司&#xff0c;力扣 希望在 IPO 之前开展一些项目以增加其资本。 由于资源有限&#xff0c;它只能在 IPO 之前完成最多 k 个不同的项目。帮助 力扣 设计完成最多 k 个…

记一次打包的诡异现象

一、前情提要&#xff1a; 今天线上打包&#xff0c;发现启动正常&#xff0c;但是访问异常&#xff0c;看日志也没有打印出什么异常信息。 更新的微服务包访问的时候一直报出【403】&#xff0c;访问被拒 项目架构&#xff1a;springBoot maven 二、机缘巧合&#xff1a; 上午…

转载:mysql存储过程讲解

记录MYSQL存储过程中的关键语法&#xff1a; DELIMITER // 声明语句结束符&#xff0c;用于区分; CEATE PROCEDURE demo_in_parameter(IN p_in int) 声明存储过程 BEGIN …. END 存储过程开始和结束符号 SET p_in1 变量赋值 DECLARE l_int int unsigned default 4000000; 变…

Diffie-Hellman:安全网络通信背后的天才算法

Lets start with a quick thought experiment.让我们从快速思考实验开始。 You have a network of 3 computers, used by Alice, Bob, and Charlie. All 3 participants can send messages, but just in a way that all other clients who connected to the network can read …