基本介绍:
1 2 3 4 5 6 |
● Elasticsearch 是一个实时的分布式搜索分析引擎, 它能让你以一个之前从未有过的速度和规模,去探索你的数据。 它被用作全文检索、结构化搜索、 分析以及这三个功能的组合。 ● Elasticsearch是一个基于Apache Lucene的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜 索引擎库。 但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中。 ● Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。 ● Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。 ● Elasticsearch非常适合全文检索。 ● Elasticsrarch 可以灵活的存储不同类型的数据。 |
索引词
1 |
在elastiasearch中索引词(term)是一个能够被索引的精确值.foo,Foo,FOO几个单词是不同的索引词.索引词(term)是可以通过term查询进行准确的搜索. |
文本(text)
1 |
文本是一段普通的非结构化文字。通常,文本会被分拆成一个个的索引词,存储在elasticsearch的索引库中。为了让文本能够进行搜索,文本字段需要事先进行分析了;当对文本中的关键词进行查询的时候,搜索引擎应该根据搜索条件搜索出原文本。 |
分析(analysis)
1 |
分析是将文本转换为索引词的过程,分析的结果依赖于分词器。比如:FOO BAR,Foo-Bar和foo bar这几个词有可能会被分析成相同的索引词foo和bar,这些索引词存储在Elasticsearch的索引库中。 |
集群(cluster)
1 |
集群由一个或多个节点组成,对外提供服务,对外提供索引和搜索功能。在所有节点,一个集群有一个唯一的名称默认为“elasticsearch”.此名称是很重要的,因为每个节点只能是集群的一部分,当该节点被设置为相同的集群名称时,就会自动加入集群。当需要有多个集群的时候,要确保每个集群的名称不能重复,,否则节点可能会加入到错误的集群。请注意,一个节点只能加入到一个集群。此外,你还可以拥有多个独立的集群,每个集群都有其不同的集群名称。 |
节点(node)
1 |
一个节点是一个逻辑上独立的服务,它是集群的一部分,可以存储数据,并参与集群的索引和搜索功能。就像集群一样,节点也有唯一的名字,在启动的时候分配。如果你不想要默认名称,你可以定义任何你想要的节点名.这个名字在理中很重要,在Elasticsearch集群通过节点名称进行管理和通信.一个节点可以被配置加入到一个特定的集群。默认情况下,每个节点会加人名为Elasticsearch 的集祥中,这意味着如果你在网热动多个节点,如果网络畅通,他们能彼此发现井自动加人名为Elasticsearch 的一个集群中,你可以拥有多个你想要的节点。当网络没有集祥运行的时候,只要启动一个节点,这个节点会默认生成一个新的集群,这个集群会有一个节点。 |
分片(shard)
1 2 3 |
分片是单个Lucene 实例,这是Elasticsearch管理的比较底层的功能。索引是指向主分片和副本分片的逻辑空间。对于使用,只需要指定分片的数量,其他不需要做过多的事情。在开发使用的过程中,我们对应的对象都是索引,Elasticsearch 会自动管理集群中所有的分片,当发生故障的时候,Elasticsearch 会把分片移动到不同的节点或者添加新的节点。 一个索引可以存储很大的数据,这些空间可以超过一个节点的物理存储的限制。例如,十亿个文档占用磁盘空间为1TB。仅从单个节点搜索可能会很慢,还有一台物理机器也不一定能存储这么多的数据。为了解决这一问题,Elasticsearch将索引分解成多个分片。当你创建一个索引,你可以简单地定义你想要的分片数量。每个分片本身是一个全功能的、独立的单元,可以托管在集群中的任何节点。 |
主分片
1 2 3 |
每个文档都存储在一个分片中,当你存储一个文档的时候,系统会首先存储在主分片中,然后会复制到不同的副本中。 默认情况下,一个索引有5个主分片。 你可以事先制定分片的数量,当分片一旦建立,则分片的数量不能修改。 |
索引(index)
1 |
索引是具有相同结构的文档集合。例如,可以有一个客户信息的索引,包括一个产品目录的索引,一个订单数据的索引。 在系统上索引的名字全部小写,通过这个名字可以用来执行索引、搜索、更新和删除操作等。在单个集群中,可以定义多个你想要的索引。 |
类型(type)
1 |
在索引中,可以定义一个或多个类型,类型是索引的逻辑分区。在一般情况下,一种类型被定义为具有一组公共字段的文档。例如,让我们假设你运行一个博客平台,并把所有的数据存储在一个索引中。在这个索引中,你可以定义一种类型为用户数据,一种类型为博客数据,另一种类型为评论数据。 |
文档(doc)
1 |
文档是存储在Elasticsearch中的一个JSON格式的字符串。它就像在关系数据库中表的一行。每个存储在索引中的一个文档都有一个类型和一个ID,每个文档都是一个JSON对象,存储了零个或者多个字段,或者键值对。原始的JSON 文档假存储在一个叫作Sour的字段中。当搜索文档的时候默认返回的就是这个字段。 |
映射
1 |
映射像关系数据库中的表结构,每一个索引都有一个映射,它定义了索引中的每一个字段类型,以及一个索引范围内的设置。一个映射可以事先被定义,或者在第一次存储文档的时候自动识别。 |
字段
1 |
文档中包含零个或者多个字段,字段可以是一个简单的值(例如字符串、整数、日期),也可以是一个数组或对象的嵌套结构。字段类似于关系数据库中表的列。每个字段都对应一个字段类型,例如整数、字符串、对象等。字段还可以指定如何分析该字段的值。 |
主键
1 |
ID是一个文件的唯一标识,如果在存库的时候没有提供ID,系统会自动生成一个ID,文档的index/type/id必须是唯一的。 |
部署单节点Elasticsearch服务
添加主机名解析
1 |
[root@db01 ~]# echo '172.16.1.72 db01' >> /etc/hosts |
安装java环境
1 2 3 4 5 6 7 8 9 10 |
[root@db01 ~]# yum install java-1.8.0-openjdk -y #或者上传包解压 [root@db01 ~]# rz jdk-8u181-linux-x64.rpm #验证 [root@db01 ~]# java -version |
配置内核参数
1 |
max_map_count文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量。虚拟内存区域是一个连续的虚拟地址空间区域。在进程的生命周期中,每当程序尝试在内存中映射文件,链接到共享内存段,或者分配堆空间的时候,这些区域将被创建。调优这个值将限制进程可拥有VMA的数量。限制一个进程拥有VMA的总数可能导致应用程序出错,因为当进程达到了VMA上线但又只能释放少量的内存给其他的内核进程使用时,操作系统会抛出内存不足的错误。如果你的操作系统在NORMAL区域仅占用少量的内存,那么调低这个值可以帮助释放内存给内核用。 |
1 2 3 4 |
[root@db01 ~]# echo 'vm.max_map_count = 655360' >> /etc/sysctl.conf [root@db01 ~]# sysctl -p /etc/sysctl.conf vm.max_map_count = 655360 |
安装
1 2 3 |
[root@db01 ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.0.rpm [root@db01 ~]# rpm -ivh elasticsearch-6.6.0.rpm |
ES相关的配置文件
1 2 3 4 5 6 7 8 9 10 |
[root@es01 ~]# rpm -qc elasticsearch /etc/elasticsearch/elasticsearch.yml #主配置文件 /etc/elasticsearch/jvm.options #虚拟内存设置文件 /etc/elasticsearch/log4j2.properties #日志配置 /etc/elasticsearch/role_mapping.yml #索引的规则文件 /etc/elasticsearch/roles.yml #规则文件 /etc/init.d/elasticsearch #启动脚本 /etc/sysconfig/elasticsearch #es的系统配置 /usr/lib/sysctl.d/elasticsearch.conf #库文件的配置 /usr/lib/systemd/system/elasticsearch.service #systemd管理启动程序 |
配置ES参数
1 2 3 4 5 6 7 8 9 |
[root@es02 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml #cluster.name: es-cluster # 集群名称(单机节点ES需要注释,多节点需要打开。区别:日志文件不同) node.name: es-2 # 节点名称 path.data: /var/lib/elasticsearch # 数据存放位置 path.logs: /var/log/elasticsearch # 日志存放位置 bootstrap.memory_lock: true # 内存空间锁定 network.host: 172.16.1.72,10.0.0.72 # 节点监测的主机名或IP地址 http.port: 9200 # 监听的端口 |
开放ES可用内存
1 2 3 4 5 |
[root@db01 ~]# vim /usr/lib/systemd/system/elasticsearch.service [Service] LimitMEMLOCK=infinity |
设置ES可用内存
当前设置为最大与最小都是 512Mb内存。官方说明最大不要超过32G,超过32G性能反而会下降。
1 2 3 4 5 6 |
# 默认就是 1G [root@db01 ~]# vim /etc/elasticsearch/jvm.options +22 -Xms512m -Xmx512m |
启动ES服务
1 2 3 4 5 6 7 |
[root@db01 ~]# systemctl daemon-reload [root@db01 ~]# systemctl start elasticsearch.service [root@db01 ~]# systemctl enable elasticsearch.service [root@db01 ~]# netstat -tunpl |grep java tcp6 0 0 172.16.1.72:9200 :::* LISTEN 6050/java tcp6 0 0 172.16.1.72:9300 :::* LISTEN 6050/java |
验证elasticsearch状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[root@db01 ~]# curl 172.16.1.72:9200/_cluster/health?pretty { "cluster_name" : "elasticsearch", "status" : "green", "timed_out" : false, "number_of_nodes" : 1, "number_of_data_nodes" : 1, "active_primary_shards" : 0, "active_shards" : 0, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 0, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 100.0 } |
与ES进行交互
使用curl命令与ES进行交互
创建索引(建库)
1 2 3 4 5 6 |
[root@es01 ~]# curl -XPUT '10.0.0.71:9200/student?pretty' { "acknowledged" : true, "shards_acknowledged" : true, "index" : "student" } |
插入数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[root@es01 ~]# curl -XPUT '10.0.0.71:9200/student/user/1?pretty' -H 'Content-Type: application/json' -d '{"name": "lhd","sex":"man","age":"18","about":"good good study","interests":["chinese","english"]}' { "_index" : "student", "_type" : "user", "_id" : "1", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 0, "_primary_term" : 1 } |
查看数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[root@es01 ~]# curl -GET '10.0.0.71:9200/student/user/1?pretty' { "_index" : "student", "_type" : "user", "_id" : "1", "_version" : 3, "_seq_no" : 2, "_primary_term" : 1, "found" : true, "_source" : { "name" : "lhd", "sex" : "man", "age" : "18", "about" : "good good study", "interests" : [ "chinese", "english" ] } } |
使用插件的方式进行交互
1 2 3 4 5 6 7 |
插件是为了完成不同的功能,官方提供了一些插件但大部分是收费的,另外也有一些开发爱好者提供的插件,可以实现对elasticsearch集群的状态监控与管理配置等功能,我们现在要安装的是Elasticsearch的head插件,此插件提供elasticsearch的web界面功能。 安装Elasticsearch的head插件时,要安装npm,npm的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载、安装、上传以及管理已经安装的包。 在Elasticsearch 5.x版本以后不再支持直接安装head插件,而是需要通过启动一个服务方式。 Github地址:https://github.com/mobz/elasticsearch-head |
安装Es-head插件:
1.将elasticsearch-head.tar包解压到一个目录中
2.点击谷歌浏览器关闭按钮下方
3.找到更多工具下的扩展程序
4.点击加载已解压的扩展程序
5.找到解压的目录
使用kibana进行交互
1)安装kibana
1 2 3 4 5 6 7 8 |
1.上传包 [root@es01 ~]# rz [root@es01 ~]# ll -rw-r--r-- 1 root root 185123116 Jan 29 2019 kibana-6.6.0-x86_64.rpm 2.安装 [root@es01 ~]# rpm -ivh kibana-6.6.0-x86_64.rpm |
2)配置
1 2 3 4 5 |
[root@es01 ~]# grep '^[a-z]' /etc/kibana/kibana.yml server.port: 5601 server.host: "10.0.0.71" elasticsearch.hosts: ["http://172.16.1.71:9200"] |
3)启动
1 2 3 4 5 6 7 |
#启动 [root@es01 ~]# systemctl start kibana #验证 [root@es01 ~]# netstat -lntp tcp 0 0 10.0.0.71:5601 |
4)访问测试
1 2 |
http://10.0.0.71:5601 |