Elasticsearch(一):介绍、下载安装搭建、图形化管理界面、常用管理、ES读写过程

1.Elasticsearch介绍

1.1.简介

Ealsticsearch是一个基于Lucene的搜索服务器。它提供了一个RESTfull web接口的分布式全文搜索引擎。 Elasticsearch是使用Java语言开发的,并作为Apache许可条款下的开放源代码发布,是一种流行的企业级搜索引擎。 Elasticasearch用于云计算中,能够达到实时的搜索,稳定,可靠,快速,安装使用方便。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是ApacheSolr(也是基于Lucene)。

1.2.总结简介

1、elasticsearch是一个基于Luncene的分布式全文检索服务器
2、elasticsearch隐藏了Lucene的复杂性,对外提供RESTful接口来操作索引、搜索。

es和solr选择哪个?
1、如果正在使用solr可以满足需求就不要更换了。
2、如果你公司准备进行全文检索项目的开发,建议优先考虑es,因为像Github这样大规模的搜索都在用它。

1.3.Lucene->ES的发展

多年前,一个叫做ShayBanon的刚结婚不久的失业开发者,由于妻子要去伦敦学习厨师,他便跟着也去了。在他找工作的过程中,为了给妻子构建一个食谱的搜索引擎,他开始构建一个早期版本的Lucene。

直接基于Lucene工作会比较困难,所以Shay开始抽象Lucene代码以便Java程序员可以在应用中添加搜索功能。他发布了他的第一个开源项目,叫做“Compass”。

后来Shay找到一份工作,这份工作处在高性能和内存数据网格的分布式环境中,因此高性能的、实时的、分布式的搜索引擎也是理所当然需要的。然后他决定重写Compass库使其成为一个独立的服务叫做Elasticsearch。

第一个公开版本出现在2010年2月,在那之后Elasticsearch已经成为Github上最受欢迎的项目之一,代码贡献者超过300人。一家主营Elasticsearch的公司就此成立,他们一边提供商业支持一边开发新功能,不过Elasticsearch将永远开源且对所有人可用。

1.4.原理与应用

1.4.1.索引结构

下图是ElasticSearch的索引结构,右边黑蓝色色部分是原始文档,左边黄色部分是逻辑结构,逻辑结构也是为了更好的去描述ElasticSearch的工作原理及去使用物理结构中的索引文件。
在这里插入图片描述

1.4.2.正排、倒排索引

1、正排索引:查字典从第一页开始找,知道找到所在位置(文档–>关键字)
2、倒排/反向索引:查字典时通过目录查询(关键字–>文档的映射,或者说已知关键字求文档)
逻辑结构部分是一个倒排索引表,由三部分组成:
1、将搜索的文档最终以Document方式存储起来。
2、将要搜索的文档内容粉刺,所有不重复的词组成分词列表。
3、每个分词和document都有关联。
如下:
在这里插入图片描述
现在,如果我们想搜索 包含quick brown词条的文档:
在这里插入图片描述
两个文档都匹配,但是第一个文档比第二个匹配度更高。如果我们进计算匹配词条数量的简单相似性算法,那么可以说,对于我们查询的相关性来讲,第一个文档比第二个文档更符合条件

1.5.RESTful应用方法

如何使用es?
Elasticsearch提供 RESTful Api接口进行索引、搜索,并且支持多种客户端。
在这里插入图片描述

2.安装ElasticSearch

2.1.环境要求

1、jdk必须是jdk1.8.0_131以上版本。 2、ElasticSearch 需要至少4096 的线程池和
262144字节以上空间的虚拟内存才能正常启动,所以需要为虚拟机分配至少1.5G以上的内存
3、从5.0开始,ElasticSearch 安全级别提高了,不允许采用root帐号启动
4、Elasticsearch的插件要求至少centos的内核要3.5以上版本

2.2.ContentOS7安装ES

2.2.1.下载

ElasticSearch官网:https://www.elastic.co/cn/

2.2.2.设置虚拟机内存

在这里插入图片描述

2.2.3.创建用户

从5.0开始,ElasticSearch 安全级别提高了,不允许采用root帐号启动,所以我们要添加一个用户。

#1.创建elk用户组
groupadd elk
#2.创建用户admin
useradd admin
passwd admin
#3.将admin用户添加到elk组
usermod -G elk admin
#4.为用户分配权限
#chown将指定文件的拥有着改为指定的用户或组 -R处理指定目录以及其子目录下的所有文件
chown -R admin:elk /usr/upload  #文件下载/上传目录
chown -R admin:elk /usr/local  #安装目录
#5.切换用户
use admin

2.2.4.安装

ES是Java开发的应用,解压即安装:

tar -zxvf elasticsearch-6.2.2.tar.gz -C /usr/local

2.2.5.ES目录结构

#切换到es目录查看目录结构
cd /usr/local/elasticsearch-6.2.2/

目录结构:
bin 目录:可执行文件包
config 目录:配置相关目录
lib 目录:ES 需要依赖的 jar 包,ES 自开发的 jar 包
logs 目录:日志文件相关目录
modules 目录:功能模块的存放目录,如aggs、reindex、geoip、xpack、eval
plugins 目录:插件目录包,三方插件或自主开发插件
data 目录:在 ES 启动后,会自动创建的目录,内部保存 ES 运行过程中需要保存的数据。

2.3.配置文件

ES安装目录config中配置文件如下:

  • elasticsearch.yml:用于配置Elasticsearch运行参数
  • jvm.options:用于配置Elasticsearch JVM设置
  • log4j2.properties:用于配置Elasticsearch日志

2.3.1.修改elasticsearch.yml

配置如下:

cluster.name: NB_shop(一般)
node.name: power_shop_node_1
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301"]
path.data: /usr/local/elasticsearch-6.2.3/data
path.logs: /usr/local/elasticsearch-6.2.3/logs
http.cors.enabled: true
http.cors.allow-origin: /.*/

描述:

cluster.name:
       配置elasticsearch的集群名称,默认是elasticsearch。建议修改成一个有意义的名称。   
node.name:
      节点名,通常一台物理服务器就是一个节点,es会默认随机指定一个名字,建议指定一个有意义的名称,方便管理一个或多个节点组成一个cluster集群,集群是一个逻辑的概念,节点是物理概念,后边章节会详细介绍。
path.data:
       设置索引数据的存储路径,默认是es_home下的data文件夹,可以设置多个存储路径,用逗号隔开。      
path.logs:
       设置日志文件的存储路径,默认是es_home下的logs文件夹         
network.host:  
       设置绑定主机的ip地址,设置为0.0.0.0表示绑定任何ip,允许外网访问,生产环境建议设置为具体的ip。   
http.port: 9200
       设置对外服务的http端口,默认为9200。      
transport.tcp.port: 9300 
       集群结点之间通信端口      
discovery.zen.ping.unicast.hosts:[“host1:port”, “host2:port”, “…”]  
       设置集群中master节点的初始列表。
discovery.zen.ping.timeout: 3s  
       设置ES自动发现节点连接超时的时间,默认为3秒,如果网络延迟高可设置大些。
http.cors.enabled:
	   是否支持跨域,默认为false
http.cors.allow-origin:
	   当设置允许跨域,默认为*,表示支持所有域名

2.3.2.jvm.options

在jvm.options中设置 -Xms和-Xmx:

  • 将两个值设置为相等
  • 将Xmx设置为不超过物理内存的一般。

设置最下机最大的JVM堆内存大小, 默认占用内存都是1g,占用太多,调小一点:

-Xms512m
-Xmx512m

2.3.3.log4j2.properties

日志文件设置,ES使用log4j,注意日志级别的配置

2.4.启动和关闭

#必须在bin目录下
#1.启动
./elasticsearch 
#或
./elasticsearch -d
#2.关闭
ps -ef | grep elasticesearch
kill -9 pid

2.4.1.错误:内核问题

使用centos6,其linux内核版本为2.6。而Elasticsearch的插件要求至少3.5以上版本。禁用这个插件即可解决。
修改elasticsearch.yml文件,在最下面添加如下配置:

bootstrap.system_call_filter: false

2.4.3.解决文件创建权限问题

[1]: max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]

Linux 默认来说,一般限制应用最多创建的文件是 4096个。但是 ES 至少需要 65536 的文件创建权限。我们用的是admin用户,而不是root,所以文件权限不足。

使用root用户修改配置文件:

vim /etc/security/limits.conf

追加下面的内容:

* soft nofile 65536
* hard nofile 65536

2.4.4.解决线程开启限制问题

[2]: max number of threads [1024] for user [admin] is too low, increase to at least [4096]

​ 默认的 Linux 限制 root 用户开启的进程可以开启任意数量的线程,其他用户开启的进程可以开启1024 个线程。必须修改限制数为4096+。因为 ES 至少需要 4096 的线程池预备。

​ 如果虚拟机的内存是 1G,最多只能开启 3000+个线程数。至少为虚拟机分配 1.5G 以上的内存。

使用root用户修改配置:

vim /etc/security/limits.d/90-nproc.conf

修改下面的内容:

* soft nproc 1024

改为:

* soft nproc 4096

2.4.5.解决虚拟内存问题

[3]: max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

ES 需要开辟一个 262144字节以上空间的虚拟内存。Linux 默认不允许任何用户和应用直接开辟虚拟内存。

vim /etc/sysctl.conf

追加下面内容:

vm.max_map_count=655360 #限制一个进程可以拥有的VMA(虚拟内存区域)的数量

然后执行命令,让sysctl.conf配置生效:

sysctl -p

2.5.测试

​ ES 中只要启动了任意一个 ES 应用就是启动了一个 ES的 cluster 集群。默认的 ES集群命名为 elasticsearch。如果启动了多个应用(可以在多个节点或单一节点上启动多个应用),默认的ES 会自动找集群做加入集群的过程。

浏览器访问:http://192.168.219.134:9200
返回结果如下:

{
  "name" : "power_shop_node_1", # node name 结点名称。随机分配的结点名称
  "cluster_name" : "power_shop", # cluster name 集群名称。 默认的集群名称
  "cluster_uuid" : "RqHaIiYjSoOyrTGq3ggCOA", # 集群唯一 ID
  "version" : {
    "number" : "6.2.3", #版本号
    "build_hash" : "c59ff00", 
    "build_date" : "2018-03-13T10:06:29.741383Z",#发布日期
    "build_snapshot" : false,#是否快照版本
    "lucene_version" : "7.2.1",#lucene版本号
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

3.安装Kibana

3.1.什么是Kibana

​ Kibana是ES提供的一个基于Node.js的管理控制台, 可以很容易实现高级的数据分析和可视化,以图标的形式展现出来。
​ kibana可以用来编辑请求语句的,方便学习操作es的语法。有时在进行编写程序,写到查询语句时,往往我会使用kibana进行书写,然后再粘贴到程序中。(不容易出错)

3.1.下载

ElasticSearch官网:https://www.elastic.co/cn/

3.2.安装

在window中安装Kibana很方便,解压即安装

3.3.修改配置

修改config/kibana.yml配置:

server.port: 5601
server.host: "0.0.0.0" #允许来自远程用户的连接
elasticsearch.url: http://192.168.204.132:9200 #Elasticsearch实例的URL 

3.4.启动

./bin/kibana

3.5.测试

浏览器访问:http://127.0.0.1:5601
在这里插入图片描述

4.安装head

4.1.什么是head

head插件是ES的一个可视化管理插件,用来监视ES的状态,并通过head客户端和ES服务进行交互,比如创建映射、创建索引等。从ES6.0开始,head插件支持使得node.js运行。

4.2.安装

1、下载head
​ 下载地址:https://github.com/mobz/elasticsearch-head
2、运行

npm run start

4.3.测试

浏览器访问:http://127.0.0.1:9100/

5.ES常用管理

​ ES作为一个索引及搜索服务,对外提供丰富的REST接口,快速入门部分的实例使用kibana来测试,目的是对ES的使用方法及流程有个初步的认识。

5.1.index管理

5.1.1.创建index

索引库。包含若干相似结构的 Document 数据,相当于数据库的database。
语法:PUT /index_name
如:

PUT /java06
{
  "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 1
  }
}

number_of_shards - 表示一个索引库将拆分成多片分别存储不同的结点,提高了ES的处理能力
number_of_replicas - 是为每个 primary shard分配的replica shard数,提高了ES的可用性,如果只有一台服务器,设置为0
网上截得

5.1.2.修改index

注意:索引一旦创建,primary shard 数量不可变化,可以改变replica shard 数量。
语法:PUT /index_name/_settings
如:

PUT /java06/_settings
{
  "number_of_replicas" : 1
}

ES 中对 shard 的分布是有要求的,有其内置的特殊算法:
​ Replica shard 会保证不和他的那个 primary shard 分配在同一个节点上;如过只有一个节点,则此案例执行后索引的状态一定是yellow。

5.1.3.删除index

DELETE /java06[, other_index]

5.2.mapping管理

映射,创建映射就是向索引库中创建field(类型、是否索引、是否存储等特性)的过程,下边是document和field与关系数据库的概念的类比:

elasticsearch关系数据库
index(索引库)database(数据库)
type(类型)table(表)
document(文档)row(记录)
field(域)column(字段)

注意:6.0之前的版本有type(类型)概念,type相当于关系数据库的表,ES6.x 版本之后,type概念被弱化ES官方将在ES7.0版本中彻底删除type。

5.2.1 创建mapping

语法:POST /index_name/type_name/_mapping
如:

POST /java06/course/_mapping
{
  "properties": {
     "name": {
        "type": "text"
     },
     "description": {
        "type": "text"
     },
     "studymodel": {
        "type": "keyword"
     }
  }
}

效果:
[(img-CQcul9ET-1663852821908)(assets\1589289014513.png)]

5.2.2.查询mapping

查询所有索引的映射:

GET /java06/course/_mapping

5.2.3.更新mapping

映射创建成功可以添加新字段,已有字段不允许更新。

5.2.4.删除mapping

通过删除索引来删除映射。

5.3.document管理

5.3.1.创建document

ES中的文档相当于MySQL数据库表中的记录。

5.3.1.1.POST语法

此操作为 ES 自动生成 id 的新增 Document 方式。
语法:POST /index_name/type_name/id
如:

POST /java06/course/1
{
  "name":"python从入门到放弃",
  "description":"人生苦短,我用Python",
  "studymodel":"201002"
}

POST /java06/course
{
  "name":".net从入门到放弃",
  "description":".net程序员谁都不服",
  "studymodel":"201003"
}
5.3.1.2.PUT语法

此操作为手工指定 id 的 Document 新增方式。
语法:PUT/index_name/type_name/id{field_name:field_value}
如:

PUT /java06/course/2
{
  "name":"php从入门到放弃",
  "description":"php是世界上最好的语言",
  "studymodel":"201001"
}

结果:

{
  "_index": "test_index", 新增的 document 在什么 index 中,
  "_type": "my_type", 新增的 document 在 index 中的哪一个 type 中。
  "_id": "1", 指定的 id 是多少
  "_version": 1, document 的版本是多少,版本从 1 开始递增,每次写操作都会+1
  "result": "created", 本次操作的结果,created 创建,updated 修改,deleted 删除
  "_shards": { 分片信息
      "total": 2, 分片数量只提示 primary shard
      "successful": 1, 数据 document 一定只存放在 index 中的某一个 primary shard 中
      "failed": 0
  },
  "_seq_no": 0, 
  "_primary_term": 1
}

通过head查询数据:
在这里插入图片描述

5.3.2.查询document

语法:
GET /index_name/type_name/id

GET /index_name/type_name/_search?q=field_name:field_value
如:根据课程id查询文档

GET /java06/course/1

例如:查询所有记录

GET /java06/course/_search

例如:查询名称中包括php 关键字的的记录

GET /java06/course/_search?q=name:门

结果:

{
  "took": 1, # 执行的时长。单位毫秒
  "timed_out": false, # 是否超时
  "_shards": { # shard 相关数据
    "total": 1, # 总计多少个 shard
    "successful": 1, # 成功返回结果的 shard 数量
    "skipped": 0,
    "failed": 0
  },
  "hits": { # 搜索结果相关数据
    "total": 3, # 总计多少数据,符合搜索条件的数据数量
    "max_score": 1, # 最大相关度分数,和搜索条件的匹配度
    "hits": [# 具体的搜索结果
      {
        "_index": "java06",# 索引名称
        "_type": "course", # 类型名称
        "_id": "1",# id 值
        "_score": 1, # 匹配度分数,本条数据匹配度分数
        "_source": { # 具体的数据内容
          "name": "php从入门到放弃",
          "description": "php是世界上最好的语言",
          "studymodel": "201001"
        }, {
			"_index": "java06",
			"_type": "course",
			"_id": "2",
			"_score": 0.13353139,
			"_source": {
				"name": "php从入门到放弃",
				"description": "php是世界上最好的语言",
				"studymodel": "201001"
			}
		}, {
			"_index": "java06",
			"_type": "course",
			"_id": "6ljFCnIBp91f7uS8FkjS",
			"_score": 0.13353139,
			"_source": {
				"name": ".net从入门到放弃",
				"description": ".net程序员谁都不服",
				"studymodel": "201003"
			}
		}
	 ]
  }
}

5.3.3.删除Document

​ ES 中执行删除操作时,ES先标记Document为deleted状态,而不是直接物理删除。当ES 存储空间不足或工作空闲时,才会执行物理删除操作,标记为deleted状态的数据不会被查询搜索到(ES 中删除 index ,也是标记。后续才会执行物理删除。所有的标记动作都是为了NRT(近实时)实现)
语法:DELETE /index_name/type_name/id
如:

DELETE /java06/course/3

结果:

{
  "_index": "java06",
  "_type": "course",
  "_id": "2",
  "_version": 2,
  "result": "deleted",
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 3,
  "_primary_term": 1
}

5.4.ES读写过程

5.4.1.documnet routing(数据路由)

当客户端创建document的时候,es需要确定这个document放在该index哪个shard上,这个过程就是document routing。
路由过程:

  1. 路由算法:shard = hash(5)%number_of_primary_shards
  2. id:document的id,可能是手动,也可能是自动生成,决定一个document在哪个shard上
  3. number_of_primary_shards:主分片数量。

5.4.2.为什么primary shard数量不可变?

1.假设集群初始化有5个primary shard,往里边加如一个document id=5
2.假如hash(5)= 13,则hash(5)%5 = 3,这个id=5将被加入到P3这个分片上
3.随后我们又新增一个primary shard,此时就有6个主分片
4.当我们GET id=5,es又经过路由算法计算结果为1,则会在P1找,而实际存储在P3上,就会找不到这个文档
5.所以es分布式集群无法添加primary shard(主分片),但是可以扩展replicas shard(从分片)。

常用方法总结

以下类比mysql进行总结,易懂易记

#################1.index管理##########################
//1.1.插入index
PUT /index_name(数据库名)
{
	"settings": {
		"number_of_shards": 2,
		"number_of_replicas": 1
	}
}
//1.2.修改idnex
PUT /index_name/_settings
{
	"number_of_replicas": 0
}
//1.3.删除index
DELETE /index_name

#################2.Mapping管理########################
//2.1.创建mapping(类比建表建字段)
POST /index_name/type_name(表名)/_mapping
{
	"properties": {
     "字段名": {
        "字段类型": "text"
     },
     "studymodel": {
        "type": "keyword"
     }
  }
}
//2.2.查询mapping
GET /index_name/type_name/_mappingh
//2.3.更新mapping
映射创建成功可以添加新字段,已有字段不允许更新
//2.4.删除mapping
通过删除索引(数据库)来删除映射。

#################3.document管理########################
//3.1新增document
	//3.1.1POST语法
	POST /index_name/type_name/id(不指定id,将自动生成随机id)
	{
		"字段名":"字段值",
	    "studymodel":"201002"
	}
	//3.1.2PUT语法
	PUT /index_name/type_name/id
	{
		"字段名":"字段值",
	    "studymodel":"201002"
	}
//3.2.查询document
	//3.2.1.根据id查单个
	GET /index_name/type_name/id
	//3.2.2.查询全部
	GET /index_name/type_name/_search
	//3.2.3.按条件
	GET /index_name/type_name/_search?q=field_name:field_value
//3.3.删除document
DELETE /index_name/type_name/id
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值