栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

ElasticSearch学习

ElasticSearch学习

HTTP操作 索引操作
  1. 创建索引:向 ES 服务器发 PUT 请求: http://127.0.0.1:9200/shopping
    类似于MySQL中创建数据库
  2. 获取索引、删除索引:使用GET、DELETe请求
{
 "acknowledged"【响应结果】: true, # true 操作成功
 "shards_acknowledged"【分片结果】: true, # 分片操作成功
 "index"【索引名称】: "shopping"
}
 重复添加索引会返回错误信息
 查看单个索引
 {
 	 "shopping"【索引名】: { 
		 "aliases"【别名】: {},
		 "mappings"【映射】: {},
		 "settings"【设置】: {
				 "index"【设置 - 索引】: {
				 "creation_date"【设置 - 索引 - 创建时间】: "1614265373911",
				 "number_of_shards"【设置 - 索引 - 主分片数量】: "1",
				 "number_of_replicas"【设置 - 索引 - 副分片数量】: "1",
				 "uuid"【设置 - 索引 - 唯一标识】: "eI5wemRERTumxGCc1bAk2A",
				 "version"【设置 - 索引 - 版本】: {
 					"created": "7080099"
				 },
				 "provided_name"【设置 - 索引 - 名称】: "shopping"
			 }
		 }
	 }
  }
  1. 查看所有索引:向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/_cat/indices?v
文档操作
  1. 创建文档:向 ES 服务器发 POST 请求 :http://127.0.0.1:9200/shopping/_doc
  2. 如果想要自定义唯一性标识,需要在创建时指定:http://127.0.0.1:9200/shopping/_doc/1 当自定义唯一标识的时候可以使用PUT请求
请求体内容为:
{
 "title":"小米手机",
 "category":"小米",
 "images":"http://www.gulixueyuan.com/xm.jpg",
 "price":3999.00
}
创建成功
{ 
	"_index"【索引】: "shopping" 
	"_type"【类型-文档】: "_doc", 
	"_id"【唯一标识】: "Xhsa2ncBlvF_7lxyCE9G", #可以类比为 MySQL 中的主键,随机生成 			
	"_version"【版本】: 1, 
	"result"【结果】: "created", #这里的 create 表示创建成功 
	"_shards"【分片】: { 
		"total"【分片 - 总数】: 2 
		"successful"【分片 - 成功】: 1, 
		"failed"【分片 - 失败】:  
	}, 
	"_seq_no": 0,
	__ "_primary_term": 1
}
  1. 查看文档:向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/shopping/_doc/1 需要指明唯一性标识
  2. 查看所有文档: http://127.0.0.1:9200/shopping/_doc/_search
  3. 修改文档:和新增文档一样,输入相同的 URL 地址请求,如果请求体变化,会将原有的数据内容覆盖在 Postman 中,向 ES 服务器发 POST 请求 :http://127.0.0.1:9200/shopping/_doc/1
{
 	"_index": "shopping",
	 "_type": "_doc",
	 	"_id": "1",
	 "_version"【版本】: 2,
	 "result"【结果】: "updated", # updated 表示数据被更新
	 "_shards": {
		 "total": 2,
		 "successful": 1,
		 "failed": 0
	 },
	 "_seq_no": 2,
	 "_primary_term": 2
}
  1. 修改字段:,向 ES 服务器发 POST 请求 :http://127.0.0.1:9200/shopping/_update/1
{ 
 "doc": {
 "price":3000.00
 } 
}
  1. 删除文档 使用DELETE发送请求http://127.0.0.1:9200/shopping/_doc/1
  2. 条件删除文档:一般删除数据都是根据文档的唯一性标识进行删除,实际操作时,也可以根据条件对多条数据进行删除 向 ES 服务器发 POST 请求 :http://127.0.0.1:9200/shopping/_delete_by_query
请求体内容为:
{
 	"query":{
 		"match":{
 			"price":4000.00
		 }
 	} 
}
查询操作
  1. 匹配查询:http://127.0.0.1:9200/shopping/_search
请求体
匹配查询
{
    "query":{
        "match":{
            "name":"张三"
        }
    }
}
查询所有文档
{
    "query":{
        "match_all":{}
    }
}
分页
{
    "query":{
        "match_all":{}
    },
    "from":0, #开始页
    "size":4, #一页数量
    "_source": ["name"], #想要展示的字段
    "sort":{  #排序
    	"age":{
			"order":"asc"
		}
    }
}

  1. 组合查询
    bool把各种其它查询通过must(必须 )、must_not(必须不)、should(应该)的方
    式进行组合
    在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search
{
	 "query": {
		 "bool": {
			 "must": [
				{
				"match": {
					"name": "zhangsan"
					}
				 }
			 ],
			 "must_not": [
				 {
				 "match": {
					 "age": "40"
					 }
				 }
			 ],
			 "should": [
				 {
				 "match": {
					 "sex": "男"
					 }
				 }
			 ]
		 }
	 } 
}
  1. 范围查询
    range 查询允许以下字符操作符 gt 大于>,gte 大于等于>=,lt 小于<,lte 小于等于<=
{
 "query": {
	 "range": {
 		"age": {
			"gte": 30,
 			"lte": 35
			 }
		 }
	 } 
}

或者在查询结果中进行过滤

{
	 "query": {
		 "bool": {
			 "must": [
				{
				"match": {
					"name": "zhangsan"
					}
				 }
			 ],
			"filter":{
				"range": {
	 				"age": {
						"gte": 30,
			 			"lte": 35
			 			}
		  			 }
				}
			}
}
  1. 聚合查询:聚合允许使用者对 es 文档进行统计分析,类似与关系型数据库中的 group by,当然还有很多其他的聚合,例如取最大值、平均值等等
对某个字段取最大值 max
{ "aggs":{ 
	"max_age":{
		"max":{"field":"age" } 
		}, 
		"size":0 #屏蔽原始数据
	}	
}
对某个字段取最小值 min
{ "aggs":{
	 "min_age":{
		 "min":{"field":"age" }
		  },
 		  "size":0
  		 }
   }

分组
{
    "aggs":{
        "age_group":{
            "terms":{"field":"age"},
            "aggs":{
                "age_sum":{
                    "sum":{"field":"age"}
                }    
            }
        }
    },"size":0
}
映射操作

索引库(index)中的映射了,类似于数据库(database)中的表结构(table)。
创建数据库表需要设置字段名称,类型,长度,约束等;索引库也一样,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做映射(mapping)。

在 Postman 中,向 ES 服务器发 PUT 请求 :http://127.0.0.1:9200/student/_mapping

在这里插入代码片

映射数据说明:

  • 字段名:任意填写,下面指定许多属性,例如:title、subtitle、images、price
  • type:类型,Elasticsearch 中支持的数据类型非常丰富,说几个关键的:
    1. String 类型,又分两种:
      text:可分词
      keyword:不可分词,数据会作为完整字段进行匹配
    2. Numerical:数值类型,分两类
      基本数据类型:long、integer、short、byte、double、float、half_float
      浮点数的高精度类型:scaled_float
      3.Date:日期类型
    3. Array:数组类型
    4. Object:对象
  • index:是否索引,默认为 true,也就是说你不进行任何配置,所有字段都会被索引。
    1. true:字段会被索引,则可以用来进行搜索
    2. false:字段不会被索引,不能用来搜索
  • store:是否将数据进行独立存储,默认为 false原始的文本会存储在_source 里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source 里面提取出来的。当然你也可以独立的存储某个字段,只要设置"store": true 即可,获取独立存储的字段要比从_source 中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置。
Windows 配置集群 节点配置
NODE-1001
、、、、
NODE-1002
#集群名称
cluster.name: my-application
#ip地址
network.host: localhost
#
# Set a custom port for HTTP:
#节点端口
http.port: 1002
#tcp 监听端口
transport.tcp.port: 9302

discovery.seed_hosts: ["localhost:9301"]
discovery.zen.fd.ping_timeout: 1m
discovery.zen.fd.ping_retries: 5

#跨域配置
#action.destructive_requires_name: true
http.cors.enabled: true
http.cors.allow-origin: "*"

NODE-1003
# ======================== Elasticsearch Configuration =========================
# ---------------------------------- Cluster -----------------------------------
# Use a descriptive name for your cluster:
#集群名称
cluster.name: my-application
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#节点名称
node.name: node-1003
node.master: true
node.data: true
#
# Add custom attributes to the node:
#
#node.attr.rack: r1
#
# ----------------------------------- Paths ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
#
#path.data: /path/to/data
#
# Path to log files:
#
#path.logs: /path/to/logs
#
# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
#
#bootstrap.memory_lock: true
#
# Make sure that the heap size is set to about half the memory available
# on the system and that the owner of the process is allowed to use this
# limit.
#
# Elasticsearch performs poorly when the system is swapping the memory.
#
# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#ip地址
network.host: localhost
#
# Set a custom port for HTTP:
#节点端口
http.port: 1003
#tcp 监听端口
transport.tcp.port: 9303
#链接节点
discovery.seed_hosts: ["localhost:9302"]
discovery.zen.fd.ping_timeout: 1m
discovery.zen.fd.ping_retries: 5

#跨域配置
#action.destructive_requires_name: true
http.cors.enabled: true
http.cors.allow-origin: "*"

Elasticsearch 进阶 核心概念 索引(Index)

一个索引相当于一个数据库,在一个集群中,可以定义任意多的索引。能搜索的数据必须索引,这样的好处是可以提高查询速度。
Elasticsearch 索引的精髓:一切设计都是为了提高搜索的性能。

类型(Type)

在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。不同的版本,类型发生了不同的变化

文档(document)

一个文档是一个可被索引的基础信息单元,也就是一条数据比如:你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以 JSON(Javascript Object Notation)格式来表示,而 JSON 是一个到处存在的互联网数据交互格式。
在一个 index/type 里面,你可以存储任意多的文档。

字段(Field)

相当于是数据表的字段,对文档数据根据不同属性进行的分类标识。

映射(Mapping)

mapping 是处理数据的方式和规则方面做一些限制,如:某个字段的数据类型、默认值、分析器、是否被索引等等。这些都是映射里面可以设置的,其它就是处理 ES 里面数据的一些使用规则设置也叫做映射,按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好。

分片(Shards)

一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有 10 亿文档数据的索引占据 1TB 的磁盘空间,而任一节点都可能没有这样大的磁盘空间。或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch 提供了将索引划分成多份的能力,每一份就称之为分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。分片很重要,主要有两方面的原因:

1)允许你水平分割 / 扩展你的内容容量。
2)允许你在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量。

至于一个分片怎样分布,它的文档怎样聚合和搜索请求,是完全由 Elasticsearch 管理的,对于作为用户的你来说,这些都是透明的,无需过分关心。被混淆的概念是,一个 Lucene 索引 我们在 Elasticsearch 称作 分片 。 一个Elasticsearch 索引 是分片的集合。 当 Elasticsearch 在索引中搜索的时候, 他发送查询到每一个属于索引的分片(Lucene 索引),然后合并每个分片的结果到一个全局的结果集。

副本(Replicas)

在一个网络 / 云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch 允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片(副本)。
复制分片之所以重要,有两个主要原因:

  • 在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与
    原/主要(original/primary)分片置于同一节点上是非常重要的。
  • 扩展你的搜索量/吞吐量,因为搜索可以在所有的副本上并行运行。

总之,每个索引可以被分成多个分片。一个索引也可以被复制 0 次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你事后不能改变分片的数量。默认情况下,Elasticsearch 中的每个索引被分片 1 个主分片和 1 个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有 1 个主分片和另外 1 个复制分片(1 个完全拷贝),这样的话每个索引总共就有 2 个分片,我们需要根据索引需要确定分片个数。

分配(Allocation)

将分片分配给某个节点的过程,包括分配主分片或者副本。如果是副本,还包含从主分片复制数据的过程。这个过程是由 master 节点完成的。

系统架构

一个运行中的 Elasticsearch 实例称为一个节点,而集群是由一个或者多个拥有相同cluster.name 配置的节点组成, 它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。
当一个节点被选举成为主节点时, 它将负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。 而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。
任何节点都可以成为主节点。我们的示例集群就只有一个节点,所以它同时也成为了主节点。作为用户,我们可以将请求发送到集群中的任何节点 ,包括主节点。
每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。 无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回給客户端。
Elasticsearch 对这一切的管理都是透明的

分布式集群
创建索引分配3个主分片和一个副本(每个主分片拥有一个副本分片)
{
 "settings" : {
 "number_of_shards" : 3,
 "number_of_replicas" : 1
 }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/460682.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号