谷粒商城Day9

1.简介

ElasticSearch:文本型数据库,一般是json格式,主要是通过空间换时间的方式来提高查询效率,非常消耗存储空间和内存空间。
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
ES能做什么?
全文检索(全部字段)、模糊查询(搜索)、数据分析(提供分析语法,例如聚合)

2.ElasticSearch

环境配置

设置JDK的环境变量
进入 /etc/profile:将jdk的路径改为你自己的

export JAVA_HOME=/usr/lib/java/jdk1.8.0_201/
export PATH=${JAVA_HOME}/bin:$PATH
  1. 在opt目录下新建es文件夹
  2. 上传ElasticSearch所需的安装包,并给予权限
    在这里插入图片描述
  3. 修改配置文件
    root@yyj-virtual-machine:/opt/es/elasticsearch-6.3.1/config# vi jvm.options
    在这里插入图片描述
    这里我是维持的1g。

给config下的文件权限
Chmod 777 -R elasticsearch-6.3.1

  1. elasticSearch.yml中配置es的host地址(配成本机地址,允许访问)
    在这里插入图片描述
    启动后会报错,配置太低。在这里插入图片描述
    解决方案:
    修改linux的sysctl配置文件,配置系统使用内存
    root@yyj-virtual-machine:~# vi /etc/sysctl.conf
    这里我是直接在最后一行增加配置:vm.max_map_count=262144

最后用非root权限启动elasticSearch。
yyj@yyj-virtual-machine:/opt/es/elasticsearch-6.3.1/bin$ ./elasticsearch

后面在运行elasticsearch 的时候用这个命令:
yyj@yyj-virtual-machine:/opt/es/elasticsearch-6.3.1/bin$ nohup ./elasticsearch &
这样就会将一些日志输出到nohup.out,而不是直接输出到控制台。

ElasticSearch操作工具:kibana

解压kibana
然后修改其配置文件
root@yyj-virtual-machine:/opt/es/kibana-6.3.1-linux-x86_64/config# vi kibana.yml
在这里插入图片描述
0.0.0.0表示使用localhost或者127.0.0.1都能访问

启动kibana
root@yyj-virtual-machine:/opt/es/kibana-6.3.1-linux-x86_64/bin# nohup ./kibana &

查看kibana:
在这里插入图片描述
浏览器访问:192.168.37.132:5601
在这里插入图片描述

Elasticsearch数据存储方式(基本概念)

Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。这种理解数据的方式与以往完全不同,这也是Elasticsearch能够执行复杂的全文搜索的原因之一。
(2)JSON
ELasticsearch使用Javascript对象符号(JavaScript Object Notation),也就是JSON,作为文档序列化格式。JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。它简洁、简单且容易阅读。

Elasticsearch存储结构
在这里插入图片描述
Mysql数据与ES数据转化

(1)元数据

创建文档语句
PUT atguigu/doc
{
“name”:”zhangsan”,
“age”:10
}

_index:文档所在索引名称
_type:文档所在类型名称
_id:文档唯一id
_uid:组合id,由_type和_id组成(6.x后,_type不再起作用,同_id)
_source:文档的原始Json数据,包括每个字段的内容
_all:将所有字段内容整合起来,默认禁用(用于对所有字段内容检索)
(2)名词解释

  • 索引 index

一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索引。

  • 类型 type

Es6之后,一个index中只能有一个type
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。

  • 字段Field

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

  • document

一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以JSON(Javascript Object Notation)格式来表示,而JSON是一个到处存在的互联网数据交互格式。在一个index/type里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的type。
在这里插入图片描述

es简单版的增删改查

只关注数据本身,不关注数据结构,不需要写表与表之间的关联关系

增加一个索引(库)
PUT /movie_index

删除一个索引
DELETE /movie_index

新增文档

PUT /movie_index/movie/1
{
  "id":1,
  "name":"operation red sea",
  "doubanScore":8.5,
  "artorList":[
    {"id":1,"name":"zhang yi"},
    {"id":2,"name":"hai qing"},
    {"id":3,"name":"zhang han yu"}
  ]
}

PUT /movie_index/movie/2
{
  "id":2,
  "name":"operation meigong river",
  "doubanScore":8.0,
  "actorList":[  
{"id":3,"name":"zhang han yu"}
]
}

PUT /movie_index/movie/3
{
  "id":3,
  "name":"incident red sea",
  "doubanScore":5.0,
  "actorList":[  
{"id":4,"name":"zhang chen"}
]
}

如果之前没建过index或者type,es 会自动创建。
在这里插入图片描述
直接用id查找
GET movie_index/movie/1

查询索引下的所有数据
GET movie_index/_search

按条件查询:
在这里插入图片描述
_score:表示相关性,即搜索内容跟搜索结果的匹配度
_score以前的内容表示元数据;
_source:真正的查询结果

查询带“红”的所有内容:

GET movie_index/movie/_search
{
  "query": {
    "match": {
      "name": "red"
    }
  }
}

在这里插入图片描述

对于中文的分词

加入中文分词器
分词机制:
对原始文本进行处理(清洗)–>

集群

克隆一台新的虚拟机

当前虚拟机关机状态下新建一个镜像

然后
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

更改克隆机器的配置

IP配置参考这篇文章

yyj@yyj-virtual-machine-clone: /etc/netplan$ vi 01-network-manager-all.yaml
修改/etc/network/interfaces下的ip

修改集群配置

修改配置文件elasticserach.yml
vim /elasticsearch.yml

# 集群名称,必须相同 
cluster.name: aubin-cluster     

# 节点名称,仅仅是描述名称,用于在日志中区分(自定义)
node.name: es1(必须不同)

#指定了该节点可能成为 master 节点,还可以是数据节点
# 数据的默认存放路径(自定义)
node.master: true
node.data: true
path.data: /opt/data

# 日志的默认存放路径 
path.logs: /opt/logs 

# 当前节点的IP地址 (本机ip)
network.host: 192.168.0.1 

# 对外提供服务的端口
http.port: 9200 

#9300为集群服务的端口 (集群间通讯的接口)
transport.tcp.port: 9300

# 集群个节点IP地址,也可以使用域名,需要各节点能够解析 (除本机ip外的所有节点的ip)
discovery.zen.ping.unicast.hosts: ["172.18.68.11", "172.18.68.12","172.18.68.13"] 

# 为了避免脑裂,集群节点数最少为 半数+1
discovery.zen.minimum_master_nodes: 2 

注意:日志和数据存放的路径可能没有该文件夹,需要自己创建,并且给予777权限。

集群简介

集群节点

1、集群中一个节点会被选举为主节点(master)
2、主节点临时管理集群级别的一些变更,例如新建或删除索引、增加或移除节点等。
3、主节点不参与文档级别的变更或搜索,这意味着在流量增长的时候,该主节点不会成为集群的瓶颈。
4、任何节点都可以成为主节点。
5、用户,我们能够与集群中的任何节点通信,包括主节点。
6、每一个节点都知道文档存在于哪个节点上,它们可以转发请求到相应的节点上。
7、我们访问的节点负责收集各节点返回的数据,最后一起返回给客户端。这一切都由Elasticsearch处理。

集群健康

在Elasticsearch集群中可以监控统计很多信息,但是只有一个是最重要的:集群健康(cluster health)。集群健康有三种状态:green、yellow或red。
在这里插入图片描述

集群分片

索引只是一个用来指向一个或多个分片(shards)的“逻辑命名空间(logical namespace)”.

分片(shard)是一个最小级别“工作单元(worker unit)”,它只是保存了索引中所有数据的一部分,是一个Lucene实例,并且它本身就是一个完整的搜索引擎。我们的文档存储在分片中,并且在分片中被索引,但是我们的应用程序不会直接与它们通信,取而代之的是,直接与索引通信。
分片是Elasticsearch在集群中分发数据的关键。把分片想象成数据的容器。文档存储在分片中,然后分片分配到你集群中的节点上。当你的集群扩容或缩小,Elasticsearch将会自动在你的节点间迁移分片,以使集群保持平衡。
1、主分片
索引中的每个文档属于一个单独的主分片,所以主分片的数量决定了索引最多能存储多少数据。
理论上主分片能存储的数据大小是没有限制的,限制取决于你实际的使用情况。分片的最大容量完全取决于你的使用状况:硬件存储的大小、文档的大小和复杂度、如何索引和查询你的文档,以及你期望的响应时间。
2、副分片
复制分片只是主分片的一个副本,它可以防止硬件故障导致的数据丢失,同时可以提供读请求,比如搜索或者从别的shard取回文档。

当索引创建完成的时候,主分片的数量就固定了,但是复制分片的数量可以随时调整。

主分片设置后不能进行修改,只能修改副本分片

集群的健康状态yellow表示所有的主分片(primary shards)启动并且正常运行了——集群已经可以正常处理任何请求——但是复制分片(replica shards)还没有全部可用。事实上所有的三个复制分片现在都是unassigned状态——它们还未被分配给节点。在同一个节点上保存相同的数据副本是没有必要的,如果这个节点故障了,那所有的数据副本也会丢失。

故障转移

在单一节点上运行意味着有单点故障的风险——没有数据备份。幸运的是,要防止单点故障,我们唯一需要做的就是启动另一个节点。

第二个节点已经加入集群,三个复制分片(replica shards)也已经被分配了——分别对应三个主分片,这意味着在丢失任意一个节点的情况下依旧可以保证数据的完整性。
文档的索引将首先被存储在主分片中,然后并发复制到对应的复制节点上。这可以确保我们的数据在主节点和复制节点上都可以被检索。

集群操作原理

操作数据节点工作流程

每个节点都有能力处理任意请求。每个节点都知道任意文档所在的节点,所以也可以将请求转发到需要的节点。

新建、索引和删除请求都是写(write)操作,它们必须在主分片上成功完成才能复制到相关的复制分片上。
在这里插入图片描述

  1. 客户端给Node 1发送新建、索引或删除请求。
  2. 节点使用文档的_id确定文档属于分片0。它转发请求到Node 3,分片0位于这个节点上。
  3. Node 3在主分片上执行请求,如果成功,它转发请求到相应的位于Node 1和Node 2的复制节点上。当所有的复制节点报告成功,Node 3报告成功到请求的节点,请求的节点再报告给客户端。

replication
复制默认的值是sync。这将导致主分片得到复制分片的成功响应后才返回。
如果你设置replication为async,请求在主分片上被执行后就会返回给客户端。它依旧会转发请求给复制节点,但你将不知道复制节点成功与否。
上面的这个选项不建议使用。默认的sync复制允许Elasticsearch强制反馈传输。async复制可能会因为在不等待其它分片就绪的情况下发送过多的请求而使Elasticsearch过载。

检索流程

文档能够从主分片或任意一个复制分片被检索。
在这里插入图片描述

  1. 客户端给Node 1发送get请求。
  2. 节点使用文档的_id确定文档属于分片0。分片0对应的复制分片在三个节点上都有。此时,它转发请求到Node 2。
  3. Node 2返回文档(document)给Node 1然后返回给客户端。
    对于读请求,为了平衡负载,请求节点会为每个请求选择不同的分片——它会循环所有分片副本。
    可能的情况是,一个被索引的文档已经存在于主分片上却还没来得及同步到复制分片上。这时复制分片会报告文档未找到,主分片会成功返回文档。一旦索引请求成功返回给用户,文档则在主分片和复制分片都是可用的。

节点、分片、索引

1 节点
一个节点就是一个es的服务器,es集群中,主节点负责集群的管理和任务的分发,一般不负责文档的增删改查
2 片
分片是es的实际物理存储单元(一个lucene的实例)
3 索引
索引是es的逻辑单元,一个索引一般建立在多个不同机器的分片上
4 复制片
每个机器的分片一般在其他机器上会有两到三个复制片(目的是提高数据的容错率)
5 容错
一旦集群中的某些机器发生故障,那么剩余的机器会在主机点的管理下,重新分配资源(分片)
6 分片的路由
写操作(新建、删除)只在主分片上进行,然后将结果同步给复制分片
Sync 主分片同步给复制成功后,才返回结果给客户端
Async 主分片在操作成功后,在同步复制分片的同时返回成功结果给客户端
读操作(查询)可以在主分片或者复制分片上进行

谷粒搜索模块

数据结构的准备
项目的初始化
es客户端的整合
谷粒搜索代码的开发
A搜索功能
B面包屑功能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值