Elasticsearch

一、ElasticSearch简介

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。
 

二、安装和配置

我们将在linux下安装Elasticsearch。

2.1.新建一个用户leyou

出于安全考虑,elasticsearch默认不允许以root账号运行。

创建用户:

useradd leyou

设置密码:

passwd leyou

切换用户:

su - leyou

 

2.2.上传安装包,并解压

我们将安装包上传到:/home/leyou目录

 

 

 

 

 

解压缩:

tar -zxvf elasticsearch-6.2.4.tar.gz

我们把目录重命名:

mv elasticsearch-6.3.0 elasticsearch

 

 进入,查看目录结构:

 

 

2.3.修改配置

我们进入config目录:cd config

需要修改的配置文件有两个:

 

  •  jvm.options

       

Elasticsearch基于Lucene的,而Lucene底层是java实现,因此我们需要配置jvm参数。

编辑jvm.options:

vim jvm.options

默认配置如下:

-Xms1g
-Xmx1g

内存占用太多了,我们调小一些:

-Xms512m
-Xmx512m
  • elasticsearch.yml

    

vim elasticsearch.yml

修改数据和日志目录:

path.data: /home/leyou/elasticsearch/data # 数据目录位置
path.logs: /home/leyou/elasticsearch/logs # 日志目录位置

我们把data和logs目录修改指向了elasticsearch的安装目录。但是这两个目录并不存在,因此我们需要创建出来。

进入elasticsearch的根目录,然后创建:

mkdir data
mkdir logs

 

  •  修改绑定的ip:

  

network.host: 0.0.0.0 # 绑定到0.0.0.0,允许任何ip来访问

elasticsearch.yml的其它可配置信息:

属性名说明
cluster.name 配置elasticsearch的集群名称,默认是elasticsearch。建议修改成一个有意义的名称。
node.name 节点名,es会默认随机指定一个名字,建议指定一个有意义的名称,方便管理
path.conf 设置配置文件的存储路径,tar或zip包安装默认在es根目录下的config文件夹,rpm安装默认在/etc/ elasticsearch
path.data 设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号隔开
path.logs 设置日志文件的存储路径,默认是es根目录下的logs文件夹
path.plugins 设置插件的存放路径,默认是es根目录下的plugins文件夹
bootstrap.memory_lock 设置为true可以锁住ES使用的内存,避免内存进行swap
network.host 设置bind_host和publish_host,设置为0.0.0.0允许外网访问
http.port 设置对外服务的http端口,默认为9200。
transport.tcp.port 集群结点之间通信端口
discovery.zen.ping.timeout 设置ES自动发现节点连接超时的时间,默认为3秒,如果网络延迟高可设置大些
discovery.zen.minimum_master_nodes 主结点数量的最少值 ,此值的公式为:(master_eligible_nodes / 2) + 1 ,比如:有3个符合要求的主结点,那么这里要设置为2

 

三、运行

进入elasticsearch/bin目录,可以看到下面的执行文件:

 

 然后输入命令:

./elasticsearch

发现报错了,启动失败。

3.1.错误1:内核过低

 

 

 

 

我们使用的是centos6,其linux内核版本为2.6。而Elasticsearch的插件要求至少3.5以上版本。不过没关系,我们禁用这个插件即可。

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

bootstrap.system_call_filter: false

然后重启

3.2.错误2:文件权限不足

 

再次启动,又出错了:

 

 

 

 

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

 

我们用的是leyou用户,而不是root,所以文件权限不足。

首先用root用户登录。

然后修改配置文件:

vim /etc/security/limits.conf

添加下面的内容:

* soft nofile 65536

* hard nofile 131072

* soft nproc 4096

* hard nproc 4096

3.3.错误3:线程数不够

刚才报错中,还有一行:

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

这是线程数不够。

继续修改配置:

 

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

修改下面的内容:

* soft nproc 1024

  改为:

* soft nproc 4096

3.4.错误4:进程虚拟内存

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

 

vm.max_map_count:限制一个进程可以拥有的VMA(虚拟内存区域)的数量,继续修改配置文件, :

vim /etc/sysctl.conf 

添加下面内容:

vm.max_map_count=655360

然后执行命令:

sysctl -p

3.5.重启终端窗口

所有错误修改完毕,一定要重启你的 Xshell终端,否则配置无效。

 

3.6.启动

再次启动,终于成功了!

 

 

   

可以看到绑定了两个端口:

  • 9300:集群节点间通讯接口

  • 9200:客户端访问接口

我们在浏览器中访问:http://192.168.40.128:9200

 

 

 四、安装kibana

4.1.什么是Kibana?

 

 

Kibana是一个基于Node.js的Elasticsearch索引库数据统计工具,可以利用Elasticsearch的聚合功能,生成各种图表,如柱形图,线状图,饼图等。

而且还提供了操作Elasticsearch索引数据的控制台,并且提供了一定的API提示,非常有利于我们学习Elasticsearch的语法。

 

4.2.安装

因为Kibana依赖于node,首先先装node,我们选择在window下使用kibana。

最新版本与elasticsearch保持一致,也是6.3.0

 

解压到特定目录即可

4.3.配置运行

配置

进入安装目录下的config目录,修改kibana.yml文件:

修改elasticsearch服务器的地址:

elasticsearch.url: "http://192.168.40.128:9200"

 

 运行

进入安装目录下的bin目录:

 

 

双击运行:

 

 

发现kibana的监听端口是5601

我们访问:http://127.0.0.1:5601

 

 

4.4.控制台

选择左侧的DevTools菜单,即可进入控制台页面:

 

 在页面右侧,我们就可以输入请求,访问Elasticsearch了。

 

 

五、安装ik分词器

 

Lucene的IK分词器早在2012年已经没有维护了,现在我们要使用的是在其基础上维护升级的版本,并且开发为ElasticSearch的集成插件了,与Elasticsearch一起维护升级,版本也保持一致

 

5.1.安装

下载的zip包,解压到Elasticsearch目录的plugins目录中。

使用unzip命令解压:

unzip elasticsearch-analysis-ik-6.3.0.zip -d ik-analyzer

 

 

然后重启elasticsearch:

 

 

 

5.2.测试

大家先不管语法,我们先测试一波。

在kibana控制台输入下面的请求:

POST _analyze
{
  "analyzer": "ik_max_word",
  "text":     "我是中国人"
}

 

 

 

六、操作索引

6.1.基本概念

Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的。

对比关系:

索引(indices)--------------------------------Databases 数据库

  类型(type)-----------------------------Table 数据表

     文档(Document)----------------Row 行

       字段(Field)-------------------Columns 列 

 

详细说明:

概念说明
索引库(indices) indices是index的复数,代表许多的索引,
类型(type) 类型是模拟mysql中的table概念,一个索引库下可以有不同类型的索引,比如商品索引,订单索引,其数据格式不同。不过这会导致索引库混乱,因此未来版本中会移除这个概念
文档(document) 存入索引库原始的数据。比如每一条商品信息,就是一个文档
字段(field) 文档中的属性
映射配置(mappings) 字段的数据类型、属性、是否索引、是否存储等特性

 

 

是不是与Lucene和solr中的概念类似。

另外,在SolrCloud中,有一些集群相关的概念,在Elasticsearch也有类似的:

  • 索引集(Indices,index的复数):逻辑上的完整索引 collection1

  • 分片(shard):数据拆分后的各个部分

  • 副本(replica):每个分片的复制

 

要注意的是:Elasticsearch本身就是分布式的,因此即便你只有一个节点,Elasticsearch默认也会对你的数据进行分片和副本操作,当你向集群添加新数据时,数据也会在新加入的节点中进行平衡。

 

 

6.2.创建索引

6.2.1.语法

Elasticsearch采用Rest风格API,因此其API就是一次http请求,你可以用任何工具发起http请求

创建索引的请求格式:

  • 请求方式:PUT

  • 请求路径:/索引库名

  • 请求参数:json格式:

{
    "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 2
      }
}

 

settings:索引库的设置

  • number_of_shards:分片数量

  • number_of_replicas:副本数量

6.2.2.测试

我们先用RestClient来试试

 

 响应:

可以看到索引创建成功了。

 

6.2.3.使用kibana创建

kibana的控制台,可以对http请求进行简化,示例:

 

 

相当于是省去了elasticsearch的服务器地址

而且还有语法提示,非常舒服。

6.3.查看索引设置

语法

Get请求可以帮我们查看索引信息,格式:

 

 或者,我们可以使用*来查询所有索引库配置:

 

 

6.4.删除索引

删除索引使用DELETE请求

DELETE /索引库名

 

 

 

再次查看heima2:

 

 

 

当然,我们也可以用HEAD请求,查看索引是否存在:

 

 

 

 

6.5.映射配置

索引有了,接下来肯定是添加数据。但是,在添加数据之前必须定义映射。

什么是映射?

映射是定义文档的过程,文档包含哪些字段,这些字段是否保存,是否索引,是否分词等

只有配置清楚,Elasticsearch才会帮我们进行索引库的创建(不一定)

 

6.5.1.创建映射字段

请求方式依然是PUT

PUT /索引库名/_mapping/类型名称
{
  "properties": {
    "字段名": {
      "type": "类型",
      "index": true,
      "store": true,
      "analyzer": "分词器"
    }
  }
}
  • 类型名称:就是前面将的type的概念,类似于数据库中的不同表 字段名:任意填写 ,可以指定许多属性,例如:

  • type:类型,可以是text、long、short、date、integer、object等

  • index:是否索引,默认为true

  • store:是否存储,默认为false

  • analyzer:分词器,这里的ik_max_word即使用ik分词器

示例

发起请求:

PUT heima/_mapping/goods
{
  "properties": {
    "title": {
      "type": "text",
      "analyzer": "ik_max_word"
    },
    "images": {
      "type": "keyword",
      "index": "false"
    },
    "price": {
      "type": "float"
    }
  }
}

 

响应结果:

{
  "acknowledged": true
}

 

6.5.2.查看映射关系

GET /索引库名/_mapping

示例:

GET /heima/_mapping

响应:

{
  "heima": {
    "mappings": {
      "goods": {
        "properties": {
          "images": {
            "type": "keyword",
            "index": false
          },
          "price": {
            "type": "float"
          },
          "title": {
            "type": "text",
            "analyzer": "ik_max_word"
          }
        }
      }
    }
  }
}

 

 

 

 

 

 

 

posted @ 2020-01-16 10:27  李鹏飞lpf  阅读(102)  评论(0编辑  收藏  举报