Elasticsearch入门

Elasticsearch入门

1 简介

1.1 什么是ElasticSearch?

​ ElasticSearch是一款非常强大的、基于Lucene的开源搜索及分析引擎;它是一个实时的分布式搜索分析引擎,它能让你以前所未有的速度和规模,去探索你的数据。

它被用作**全文检索**、**结构化搜索**、**分析**以及这三个功能的组合 

​ 除了搜索,结合Kibana、Logstash、Beats开源产品,Elastic Stack(简称ELK)还被广泛运用在大数据近实时分析领域,包括:日志分析指标监控信息安全等。它可以帮助你探索海量结构化、非结构化数据,按需创建可视化报表,对监控数据设置报警阈值,通过使用机器学习,自动识别异常状况

1.2 为什么不是直接使用Lucene?

​ Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库。

​ 但是 Lucene 仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理。Lucene 非常 复杂。

​ Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单,通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API

​ 然而,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确的形容:

  • 一个分布式的实时文档存储,每个字段 可以被索引与搜索

  • 一个分布式实时分析搜索引擎

  • 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据

    ​ 摘自为什么不是直接使用Lucene

1.3 原理

1.3.1 基础概念

Near Realtime(NRT) 近实时。数据提交索引后,立马就可以搜索到。

Cluster 集群,一个集群由一个唯一的名字标识,默认为“elasticsearch”。集群名称非常重要,具有相同集群名的节点才会组成一个集群。集群名称可以在配置文件中指定。

Node 节点:存储集群的数据,参与集群的索引和搜索功能。像集群有名字,节点也有自己的名称,默认在启动时会以一个随机的UUID的前七个字符作为节点的名字,你可以为其指定任意的名字。通过集群名在网络中发现同伴组成集群。一个节点也可是集群。

Index 索引: 一个索引是一个文档的集合(等同于solr中的集合)。每个索引有唯一的名字,通过这个名字来操作它。一个集群中可以有任意多个索引。

Type 类型:指在一个索引中,可以索引不同类型的文档,如用户数据、博客数据。从6.0.0 版本起已废弃,一个索引中只存放一类数据。

Document 文档:被索引的一条数据,索引的基本信息单元,以JSON格式来表示。

Shard 分片:在创建一个索引时可以指定分成多少个分片来存储。每个分片本身也是一个功能完善且独立的“索引”,可以被放置在集群的任意节点上。

Replication 备份: 一个分片可以有多个备份(副本)

ES和数据库的对比:
请添加图片描述

1.3.2 索引结构

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

1.3.3 倒排索引

​ 倒排索引(Inverted index):也常被称为反向索引,倒排索引是从关键字到文档的映射(已知关键字求文档)。

​ 逻辑结构部分是一个倒排索引表,由三部分组成:

​ 1、将搜索的文档最终以Document方式存储起来。

​ 2、将要搜索的文档内容分词,所有不重复的词组成分词列表。

​ 3、每个分词和docment都有关联

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 安装Elasticsearch

2.2.1 下载并上传

官网地址

上传至: /usr/upload

2.2.2 创建用户并分配权限

从5.0开始,ElasticSearch 安全级别提高了,不允许采用root帐号启动

1.创建elk用户组

groupadd elk

2.创建用户admin

useradd admin

passwd admin

3.将admin用户添加到elk组

usermod -G elk admin

#查看指定组和其组员
cat /etc/group|grep elk

5.为用户分配权限

#chown将指定文件的拥有者改为指定的用户或组 -R处理指定目录以及其子目录下的所有文件
chown -R admin:elk /usr/upload
chown -R admin:elk /usr/local
2.2.3 安装
2.2.3.1 解压:
tar -zxvf elasticsearch-6.2.3.tar.gz -C /usr/local
2.2.3.2 配置文件:
cd /usr/local/elasticsearch-6.2.3/config/

elasticsearch.yml: 用于配置Elasticsearch运行参数

jvm.options: 用于配置Elasticsearch JVM设置

log4j2.properties: 用于配置Elasticsearch日志

配置elasticsearch.yml

cluster.name: power_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: ["192.168.23.17:9300", "192.168.23.17: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:#当设置允许跨域,默认为*,表示支持所有域名

配置 jvm.options

​ 设置最小及最大的JVM堆内存大小:

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

​ 1) 两个值设置为相等

​ 2) 将Xmx 设置为不超过物理内存的一半。

-Xms512m

-Xmx512m
2.2.4 启动及关闭

启动

./elasticsearch

./elasticsearch -d     #隐式启动

关闭

ps -ef | grep elasticsearch

kill -9 pid
2.2.5 内核问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jVVL8gRJ-1663905362633)(C:\Users\RJ\AppData\Roaming\Typora\typora-user-images\1528598315714.png)]

​ 而Elasticsearch的插件要求至少3.5以上版本。如果你的liunx内核版本较低,可禁用该插件。

​ 修改elasticsearch.yml文件,在最下面添加如下配置:

bootstrap.system_call_filter: false
2.2.6 解决文件创建权限问题

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

vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
2.2.7 解决线程开启限制问题

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

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

vim /etc/security/limits.d/90-nproc.conf
#修改一下内容
#* soft nproc 1024
* soft nproc 4096
2.2.8 解决虚拟内存问题

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

vim /etc/sysctl.conf

追加下面内容:

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

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

sysctl -p

2.3 测试

浏览器访问: http://192.168.23.17:9200

或ssh命令:

curl 127.0.0.1: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

​ Kibana是ES提供的一个基于Node.js的管理控制台, 可以很容易实现高级的数据分析和可视化,以图标的形式展现出来。

​ kibana可以用来编辑请求语句的,方便学习操作es的语法。有时在进行编写程序,写到查询语句时,往往我会使用kibana进行书写,然后再粘贴到程序中。(不容易出错)

3.1 下载

ElasticSearch官网

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 启动

点击 kibana.bat

3.5.测试

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

在这里插入图片描述

4 安装head

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

4.1 安装

下载地址:https://github.com/mobz/elasticsearch-head

运行

在cmd窗口中输入

npm run start

4.2 测试

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

在这里插入图片描述

5 Elasticsearch快速入门

5.1 index管理

索引库。包含若干相似结构的 Document 数据,相当于数据库的database。

创建index

PUT /index_name`

如:

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

number_of_shards - 表示一个索引库将拆分成多片分别存储不同的结点,提高了ES的处理能力

number_of_replicas - 是为每个 primary shard分配的replica shard数,提高了ES的可用性,如果只有一台机器,设置为0

索引一旦创建,primary shard 数量不可变化,可以改变replica shard 数量。

修改index

PUT /index_name/_settings

PUT /test/first
{
  "number_of_replicas" : 1
}

ES 中对 shard 的分布是有要求的,有其内置的特殊算法:

​ Replica shard 会保证不和他的那个 primary shard 分配在同一个节点上;如过只有一个节点,则此案例执行后索引的状态一定是yellow。

删除index

PUT /index_name

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。

创建mapping

POST /index_name/type_name/_mapping

POST /test/first/_mapping
{
  "properties": {
     "name": {
        "type": "text"
     },
     "age": {
        "type": "text"
     },
     "birthday": {
        "type": "keyword"
     }
  }
}

查询mapping

GET /test/first/_mapping

更新mapping

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

删除mapping

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

5.3 document管理

创建document

POST /index_name/type_name/id{field_name:field_value}

#不指定id
POST /test/first
{
  "name":"java",
  "age":"18",
  "birthday":"201002"
}
# 指定id
POST /test/first/1
{
  "name":"java",
  "age":"18",
  "birthday":"201002"
}

修改document

PUT /test/first/1
{
  "name":"java2",
  "age":"18",
  "birthday":"201002"
}

结果

{
  "_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
}

查询document

GET /index_name/type_name/id

删除document

DELETE /index_name/type_name/id
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值