# Elasticsearch5.6.0版本教程

---
## 1.安装Elasticsearch5.6.0

- 1.下载Elasticsearch5.6.0版本,将压缩包放在/usr/local/es目录下,解压压缩包
- 因为版本的问题,最新的版本安全级别提高了,不允许采用root帐号启动,所以我们要添加一个用户。

<blockquote>
<p>
    #添加一个用户:es
    $useradd es
    #给用户es设置密码,连续输入2次
    $passwd elasticsearch
    
    #创建一个用户组 es
    groupadd es
    
    #分配 es 到 es 组
    usermod -G es es
    #这里注意下,可能存在用户和用户组的问题,服务器版本不同
    
    #在es根目录下,给定用户权限。-R表示逐级(N层目录) , * 表示 任何文件
    chown  -R es.es *
    
    #切换到es用户
    su es
    #需要切换到es用户运行,否则运行会报错

</p>
</blockquote>

- 修改配置文件

<blockquote>
<p>
    $ vi config/elasticsearch.yml
    
    #cluster name
    cluster.name: sojson-application
    #节点名称
    node.name: node-1
    #绑定IP和端口
    network.host: 118.25.2.24
    http.port: 9200
</p>
</blockquote>
- elasticsearch liuix 启动服务后ctrl+c 不退出服务

> 启动时加上-d命令即可;

> ./elasticsearch -d

---

## Elasticsearch Head插件安装

**ElasticSearch Head是什么?** 
> ElasticSearch Head是集群管理、数据可视化、增删查改、查询语句可视化工具。

- 在https://github.com/mobz/elasticsearch-head下载elasticsearch-head-master.zip
- 解压elasticsearch-head-master.zip到/usr/local/

<blockquote>
<p>

    cd /usr/local/
    unzip elasticsearch-head-master.zip -d /usr/local/
    
</p>
</blockquote>

- 安装node.js环境

> wget https://npm.taobao.org/mirrors/node/latest-v4.x/node-v4.4.7-linux-x64.tar.gz

- 在/usr/local/目录下创建nodejs文件夹。

> mkdir nodejs

- 把node-v4.4.7-linux-x64.tar.gz解压到/usr/local/nodejs。
- 配置环境变量,编辑/etc/profile添加以下内容,然后执行source /etc/profile,我们接着就可以查看node.js的版本号了。

>  NODE_HOME=/usr/local/nodejs/node-v4.4.7-linux-x64
>  PATH=$PATH:$NODE_HOME/bin
>  NODE_PATH=$NODE_HOME/lib/node_modules
>  export NODE_HOME PATH NODE_PATH

- 安装grunt(grunt是基于Node.js的项目构建工具,可以进行打包压缩、测试、执行等等工作,elasticsearch-head插件就是通过grunt启动的)。进入/usr/local/elasticsearch-head-master/目录下进行安装。安装完毕,我们可以检查是否安装成功。

> npm install -g grunt-cli

> grunt -version

- 修改elasticsearch-head-master文件下的Gruntfile.js文件中,添加一行"hostname: '0.0.0.0',"

<blockquote>
<p>

    connect:{
        server:{
            options:{
                hostname:'0.0.0.0',
                port:9100,
                base:'.',
                keepalive:true
            }
        }
    }

</p>
</blockquote>

- 在elasticsearch-head-master目录下

> npm install

- 但是安装的太慢了,我不想吐槽了。我们需要将npm换个镜像。

> npm install -g cnpm --registry=https://registry.npm.taobao.org

- 我们再来安装elasticsearch-head-master.我们用cnpm代替npm

> cnpm install

- 安装完毕后,会生成一个node_modules文件夹。

- 我们还要修改elasticsearch.yml,具体如下。

<blockquote>
<p>
        
    #集群的名字 
    cluster.name:   es_cmazxiaoma_cluster
    #节点名字   
    node.name:      node-1
    #数据存储目录(多个路径)
    path.data:      /home/elasticsearch/data
    #日志目录     
    path.logs:      /home/elasticsearch/logs
    #本机的ip地址
    network.host:   192.168.12.6
    #设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点
    discovery.zen.ping.unicast.hosts:       ["192.168.12.6"]
    #设置节点间tcp端口(集群),默认9300
    transport.tcp.port:     9300
    #监听端口(默认) 
    http.port:      9200
    #增加参数,使head插件可以访问es
    http.cors.enabled:      true
    http.cors.allow-origin: "*"
</p>
</blockquote>

- 默认情况下,elasticsearch在elasticsearch-head连接的端口9200上公开一个http rest API。当不作为elasticsearch的插件运行时,您必须在elasticsearch中启用CORS,否则您的浏览器将拒绝看起来不安全的请求。看elasticsearch配置中:加http.cors.enabled:true,您还必须设置http.cors.allow-origin因为默认情况下不允许来源。http.cors.allow-origin:"*"是一个合法的值,但是它被认为是一个安全风险,因为你的集群是开放式的。

- 运行elasticsearch-head

> grunt server

- 忘记了,elasticsearch-head web端口是9100。如果我们想通过浏览器去访问它,必须在防火墙添加9100端口策略。

- 访问192.168.12.6:9100

---

## 安装anjs分词器

**注意5.x版本以后不再支持在elasticsearch.yml里面设置默认分词器,只能通过API的方式进行设置。**

- ansj下载地址:https://github.com/NLPchina/elasticsearch-analysis-ansj

- 解压压缩包,得到elasticsearch,移动到pluging目录下,
> mv elasticsearch  elasticsearch-analysis-ansj
- 重启服务,加载分词器设置。
- 设置为默认得分词器:
- 不支持动态设置,indecis处于开启状态,需要先关闭,在进行设置,设置完成后在打开。这种通过API设置的方式不需要重启elsatisearch。线上的集群最好不要重启,加载索引的时间会很久并且会引发一些错误。

<blockquote>
<p>
    
    curl -XPOST 'localhost:9200/_all/_close'

    curl -XPUT 'http://localhost:9200/_all/_settings?preserve_existing=true' -d '{
    "index.analysis.analyzer.default.type" : "index_ansj",
    "index.analysis.analyzer.default_search.type" : "query_ansj"
    }'
    
    curl -XPOST 'localhost:9200/_all/_open'
</p>
</blockquote>

- 调用测试

> http://118.25.2.24:9200/_analyze?analyzer=query_ansj&pretty=true&text=sojson%E5%9C%A8%E7%BA%BF%E5%B7%A5%E5%85%B7

---

## logstash实现将数据库数据导入elasticsearch

**1. [下载Logstash](https://www.elastic.co/cn/downloads/logstash)  安装包,需要注意版本与elasticsearch保持一致,windows系统下直接解压即可**
- 添加同步mysql数据库的配置,并将mysql连接驱动jar包放在指定的配置目录

> 注: 目前版本的logstash已经集成了logstash-jdbc-input,不需要再配置这个插件,

> 配置文件需要UTF-8编码,我在配置过程中开始新建文件默认的是GBK编码,后面启动logstash后读取配置文件报编码错误了。

**2. 在logstash-5.6.0目录下创建mysqletc文件夹,文件夹下放入blog.sql,mysql.conf,mysql-connector-java-8.0.16.jar**

- 配置文件mysql.conf

<blockquote>
<p>

        input {
            stdin {
            }
            jdbc {
              # mysql数据库连接
              jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/tests?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC"
              # mysqly用户名和密码
              jdbc_user => "root"
              jdbc_password => "root"
              # 驱动配置
              jdbc_driver_library => "D:/logstash-5.6.0/mysqletc/mysql-connector-java-8.0.13.jar"
              # 驱动类名
              jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
              jdbc_paging_enabled => "true"
              jdbc_page_size => "50000"
              # 执行指定的sql文件
              statement_filepath => "D:/logstash-5.6.0/mysqletc/blog.sql"
              # 设置监听 各字段含义 分 时 天 月  年 ,默认全部为*代表含义:每分钟都更新
              schedule => "* * * * *"
              # 索引类型(表名)
              type => "numplate"
            }
        }
         
        filter {
            json {
                source => "message"
                remove_field => ["message"]
            }
        }
         
        output {
        
            elasticsearch {
                #es服务器
                hosts => ["10.16.4.94:9200"]
                #ES索引名称
                index => "houses"
                #自增ID
                document_id => "%{id}"
            }
            
        
            stdout {
                codec => json_lines
            }
        }
</p>
</blockquote>

- Blog.sql文件:
> SELECT * FROM blog blog为数据库的表名

**3. 启动logstash,正常的话将会同步数据值elasticsearch,根据上面的配置logstash每分钟去数据库读取最新数据**

>  logstash -f ../mysqletc/mysql.conf

### **注意事项**
> 导入elasticsearch的时候,数据库中的字段不能有字段名为type的,否则定义的type类型无效