ElasticSearch安装及java Api使用

ElasticSearch 简介

ElasticSearch是一个高度可扩展的开源搜索引擎并使用REST API,因此您值得拥有。 在本教程中,将介绍开始使用ElasticSearch的一些主要概念。html

下载并运行ElasticSearch

ElasticSearch能够从elasticsearch.org下载对应的文件格式,如ZIP和TAR.GZ。下载并提取一个运行它的软件包以后不会容易得多,须要提早安装Java运行时环境。 下载连接 www.elastic.co/products/el…java

在Windows上运行ElasticSearch

  • 从命令窗口运行位于bin文件夹中的elasticsearch.bat。这将会启动ElasticSearch在控制台的前台运行,这意味着咱们可在控制台中看到运行信息或一些错误信息,并可使用CTRL + C中止或关闭它。
  • 在启动过程当中,ElasticSearch的实例运行会占用大量的内存,因此在这一过程当中,电脑会变得比较慢,须要耐心等待,启动加载完成后电脑就能够正常使用了
  • 当ElasticSearch的实例并运行,您可使用http://localhost:9200检查是否运行成功

Linux安装ElasticSearch

访问elasticSearch官网地址 www.elastic.co/ 下载指定版本的安装包:elasticsearch-6.1.1.tar.gz,上传至指定目录/usr/local/elasticsearchnode

#解压
tar -zxvf elasticsearch-6.1.1.tar.gz
#建立数据存储目录
mkdir -p /usr/local/elasticsearch/data
#建立日志存储目录
mkdir -p /usr/local/elasticsearch/logs

#进入到es安装目录下的config文件夹中,修改elasticsearch.yml 文件

#配置es的集群名称,默认是elasticsearch,es会自动发如今同一网段下的es,若是在同一网段下有多个集群,就能够用这个属性来区分不一样的集群。
cluster.name: qxw-application
#节点名称
node.name: node-1 
#设置索引数据的存储路径
path.data: /usr/local/elasticsearch/data 
#设置日志的存储路径
path.logs: /usr/local/elasticsearch/logs 
#设置当前的ip地址,经过指定相同网段的其余节点会加入该集群中
network.host: 192.168.1.191
#设置对外服务的http端口
http.port: 9200 
#设置集群中master节点的初始列表,能够经过这些节点来自动发现新加入集群的节点
discovery.zen.ping.unicast.hosts: ["node-1"]
复制代码

修改host 文件,执行命令 vi /etc/hosts linux

输入图片说明
屏幕截图.png

由于安全问题elasticsearch 不让用root用户直接运行,因此要建立新用户。nginx

useradd es
passwd es
再输入两次密码(自定义)

#给新建立用户文件夹执行权限
chown -R es:es /usr/local/elasticsearch

切换es用户:su es

启动集群命令:
cd  /usr/local/elasticsearch
bin/elasticsearch
复制代码

在es用户下启动时报错 git

输入图片说明
屏幕截图.png

缘由:Centos6不支持SecComp,而ES默认bootstrap.system_call_filter为true进行检测,因此致使检测失败,失败后直接致使ES不能启动

详见 :https://github.com/elastic/elasticsearch/issues/22899
解决方案:

在elasticsearch.yml中新增配置bootstrap.system_call_filter,设为false。
bootstrap.system_call_filter: false
复制代码

输入图片说明
屏幕截图.png

第一个问题的缘由:github

缘由:没法建立本地文件问题,用户最大可建立文件数过小

解决方案:切换到root用户,编辑limits.conf配置文件, 添加相似以下内容:

vi /etc/security/limits.conf

添加以下内容: 注意*不要去掉了

* soft nofile 65536

* hard nofile 131072

备注:* 表明Linux全部用户名称(好比 hadoop)

须要保存、退出、从新登陆才可生效。
复制代码

第二个错误的缘由:bootstrap

缘由:没法建立本地线程问题,用户最大可建立线程数过小

解决方案:切换到root用户,进入limits.d目录下,修改90-nproc.conf 配置文件。

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

找到以下内容:

* soft nproc 1024

#修改成

* soft nproc 4096
复制代码

第三个错误的缘由:浏览器

缘由:最大虚拟内存过小

每次启动机器都手动执行下。

root用户执行命令:

执行命令:sysctl -w vm.max_map_count=262144

查看修改结果命令:sysctl -a|grep vm.max_map_count  看是否已经修改

永久性修改策略:

echo "vm.max_map_count=262144" >> /etc/sysctl.conf
复制代码

切换到es用户执行:bin/elasticsearch 访问:http://192.168.1.191:9200/安全

#后台启动
[es@localhost elasticsearch-6.4.0]$ ./bin/elasticsearch -d
[es@localhost elasticsearch-6.4.0]$ jps
27587 Jps
27573 Elasticsearch
复制代码

elasticsearch 服务安全配置

1、目前主要经过插件的形式来控制:

  1. 经常使用的插件主要包括:elasticsearch-http-basic,search-guard,shield
  2. 因为shield是收费的暂时还未研究(研究后统一补充)
  3. search-guard主要用于elasticsearch2.x之后的版本(研究后统一补充)
  4. elasticsearch-http-basic主要用于elasticsearch1.x的版本
  5. 基于目前咱们es集群大部分都是1.5.2版本的,因此主要使用http-basic来控制来自http请求的访问。

2、elasticsearch-http-basic安装:

  1. 下载elasticsearch-http-basic-1.5.1.jar(下载地址:github.com/Asquera/ela…
  2. 在ES的plugins文件夹下新建http-basic文件夹
  3. 把下载的 elasticsearch-http-basic-1.5.1.jar拷贝到新建的http-basic文件夹下
  4. 修改ES的配置文件elasticsearch.yml,在文件末尾添加如下配置:
配置名                                     默认值                            说明

http.basic.enabled                         true                            开关,开启会接管所有HTTP链接

http.basic.user                          "admin"                          帐号

http.basic.password                      "admin_pw"                       密码

http.basic.ipwhitelist            ["localhost", "127.0.0.1"]    白名单内的ip访问不须要经过帐号和密码,支持ip和主机名,不支持ip区间或正则

http.basic.trusted_proxy_chains    []                                    信任代理列表

http.basic.log    false                                              把无受权的访问事件添加到ES的日志

http.basic.xforward    ""                                          记载代理路径的header字段名

5.重启ES集群
目前咱们主要经过http.basic.ipwhitelist 白名单 + 用户名、密码来控制外部机器对ES集群的http请求,

1.在白名单内的ip列表用户无需验证可直接经过ES节点的ip地址访问ES,白名单外的用户无权访问ES集群

2.因为白名单没法控制经过域名的访问,若是要经过域名访问ES必需要经过用户名和密码来访问
复制代码

java中使用elastaicsearch(RestHighLevelClient)

官方文档能够得知,如今存在至少三种Java客户端。

  1. Transport Client
  2. Java High Level REST Client
  3. Java Low Level Rest Client
  4. 强烈建议ES5及其之后的版本使用Java High Level REST Client

java High Level REST Client 介绍

  • Java High Level REST Client 是基于Java Low Level REST Client的,每一个方法均可以是同步或者异步的。同步方法返回响应对象,而异步方法名以“async”结尾,并须要传入一个监听参数,来确保提醒是否有错误发生。
  • Java High Level REST Client须要Java1.8版本和ES。而且ES的版本要和客户端版本一致。和TransportClient接收的参数和返回值是同样的。

引入maven依赖

<dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.2.3</version>
        </dependency>
复制代码

Java基础操做

public class RestClientTest {

    public static void main(String[] args) {
//        index();
//        bacthIndex();
         queryTest();
    }
    
    /**
     * 插入数据
     */
    public  static  void  index(){
        try {
            //RestHighLevelClient实例须要低级客户端构建器来构建
            RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
            IndexRequest indexRequest = new IndexRequest("demo", "demo");
            JSONObject obj=new JSONObject();
            obj.put("title","标题图表题大法师飞洒发顺丰三");
            obj.put("time","2018-08-21 17:43:50");
            indexRequest.source(obj.toJSONString(),XContentType.JSON);
            //添加索引
            client.index(indexRequest);
            client.close();

            //http://localhost:9200/demo/demo/_search  浏览器运行查询数据
        }catch (Exception e){
                e.printStackTrace();
        }
    }

    /**
     * 批量插入数据
     */
   public static  void  bacthIndex(){
       RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
       List<IndexRequest> requests = new ArrayList<>();
       requests.add(generateNewsRequest("中印边防军于拉达克举行会晤 强调维护边境和平", "2018-01-27T08:34:00Z"));
       BulkRequest bulkRequest = new BulkRequest();
       for (IndexRequest indexRequest : requests) {
           bulkRequest.add(indexRequest);
       }
       try {
           client.bulk(bulkRequest);
           client.close();
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
    public static IndexRequest generateNewsRequest(String title,String publishTime){
        IndexRequest indexRequest = new IndexRequest("demo", "demo");
        JSONObject obj=new JSONObject();
        obj.put("title",title);
        obj.put("time",publishTime);
        indexRequest.source(obj.toJSONString(),XContentType.JSON);
        return indexRequest;
    }

    /**
     * 查询操做
     * https://blog.csdn.net/paditang/article/details/78802799
     * https://blog.csdn.net/A_Story_Donkey/article/details/79667670
     * https://www.cnblogs.com/wenbronk/p/6432990.html
     */
    public static  void  queryTest(){
        RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
        // 这个sourcebuilder就相似于查询语句中最外层的部分。包括查询分页的起始,
        // 查询语句的核心,查询结果的排序,查询结果截取部分返回等一系列配置
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        try {
            // 结果开始处
            sourceBuilder.from(0);
            // 查询结果终止处
            sourceBuilder.size(2);
            // 查询的等待时间
            sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));

            /**
             * 使用QueryBuilder
             * termQuery("key", obj) 彻底匹配
             * termsQuery("key", obj1, obj2..)   一次匹配多个值
             * matchQuery("key", Obj) 单个匹配, field不支持通配符, 前缀具高级特性
             * multiMatchQuery("text", "field1", "field2"..);  匹配多个字段, field有通配符忒行
             * matchAllQuery();         匹配全部文件
             */
            MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", "费德勒");

            //分词精确查询
//            TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("tag", "体育");


//            // 查询在时间区间范围内的结果  范围查询
//            RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("publishTime");
//            rangeQueryBuilder.gte("2018-01-26T08:00:00Z");
//            rangeQueryBuilder.lte("2018-01-26T20:00:00Z");

            // 等同于bool,将两个查询合并
            BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
            boolBuilder.must(matchQueryBuilder);
//            boolBuilder.must(termQueryBuilder);
//            boolBuilder.must(rangeQueryBuilder);
            sourceBuilder.query(boolBuilder);

            // 排序
//            FieldSortBuilder fsb = SortBuilders.fieldSort("date");
//            fsb.order(SortOrder.DESC);
//            sourceBuilder.sort(fsb);


            SearchRequest searchRequest = new SearchRequest("demo");
            searchRequest.types("demo");
            searchRequest.source(sourceBuilder);
            SearchResponse response = client.search(searchRequest);
            System.out.println(response);
            client.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

复制代码

Kibana linux下安装

配置 www.elastic.co/guide/cn/ki…

server.port: 5601
server.host: "192.168.1.191"
elasticsearch.url: "http://192.168.1.191:9200"
复制代码

启动

./kibana  //不能关闭终端
nohup  ./kibana > /nohub.out &  //可关闭终端,在nohup.out中查看log
在浏览器中访问:http://192.168.1.191:5601/
复制代码

FileBeats 与 LogStash 的安装

  • LogStash 能够用来对日志进行收集并进行过滤整理后输出到 ES 中,FileBeats 是一个更加轻量级的日志收集工具。
  • 如今最经常使用的方式是经过 FileBeats 收集目标日志,而后统一输出到 LogStash 作进一步的过滤,在由 LogStash 输出到 ES 中进行存储。

官方提供了压缩包下载, www.elastic.co/downloads/l… 。 下载完成后解压便可。

tar zxvf logstash-6.2.2.tar.gz
### 进入目录
cd logstash-6.2.2
复制代码

LogStash 的运行须要指定一个配置文件,来指定数据的流向,咱们在当前目录下建立一个 first.conf 文件,其内容以下:

### 配置输入为 beats
input {
    beats {
            port => "5044"

    }

}
### 数据过滤
filter {
    grok {
            match => { "message" => "%{COMBINEDAPACHELOG}" }

    }
    geoip {
            source => "clientip"

    }

}
# 输出到本机的 ES
output {
    elasticsearch {
            hosts => [ "192.168.1.191:9200"  ]

    }

}
复制代码

上面配置了 LogStash 输出日志到 ES 中 配置完成后就能够经过以下方式启动 LogStash 了

bin/logstash -f first.conf --config.reload.automatic
复制代码

安装运行 FileBeats

FileBeats 也提供了下载包,地址为 www.elastic.co/downloads/b… 。找到系统对应的包下载后解压便可。

tar zxvf filebeat-6.2.2-darwin-x86_64.tar.gz
cd filebeat-6.2.2-darwin-x86_64
复制代码

进入目录编辑 filebeat.yml 找到对应的配置项,配置以下

- type: log
   # Change to true to enable this prospector configuration.
    enabled: True

    # Paths that should be crawled and fetched. Glob based paths.
    # 读取 Nginx 的日志
    paths:
      - /usr/local/nginx/logs/*.log

# 输出到本机的 LogStash
output.logstash:
  # The Logstash hosts
  hosts: ["localhost:5044"]
复制代码

配置完成后执行以下命令,启动 FileBeat 便可

# FileBeat 须要以 root 身份启动,所以先更改配置文件的权限
sudo chown root filebeat.yml
sudo ./filebeat -e -c filebeat.yml -d "publish"
复制代码
相关文章
相关标签/搜索