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"
複製代碼
相關文章
相關標籤/搜索