ElasticSearch安裝及java Api使用

codeing_docs發表於2019-01-10

ElasticSearch 簡介

ElasticSearch是一個高度可擴充套件的開源搜尋引擎並使用REST API,所以您值得擁有。 在本教程中,將介紹開始使用ElasticSearch的一些主要概念。

下載並執行ElasticSearch

ElasticSearch可以從elasticsearch.org下載對應的檔案格式,如ZIP和TAR.GZ。下載並提取一個執行它的軟體包之後不會容易得多,需要提前安裝Java執行時環境。 下載連結 www.elastic.co/products/el…

在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/elasticsearch

#解壓
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

輸入圖片說明
螢幕截圖.png

因為安全問題elasticsearch 不讓用root使用者直接執行,所以要建立新使用者。

useradd es
passwd es
再輸入兩次密碼(自定義)

#給新建立使用者資料夾執行許可權
chown -R es:es /usr/local/elasticsearch

切換es使用者:su es

啟動叢集命令:
cd  /usr/local/elasticsearch
bin/elasticsearch
複製程式碼

在es使用者下啟動時報錯

輸入圖片說明
螢幕截圖.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

第一個問題的原因:

原因:無法建立本地檔案問題,使用者最大可建立檔案數太小

解決方案:切換到root使用者,編輯limits.conf配置檔案, 新增類似如下內容:

vi /etc/security/limits.conf

新增如下內容: 注意*不要去掉了

* soft nofile 65536

* hard nofile 131072

備註:* 代表Linux所有使用者名稱稱(比如 hadoop)

需要儲存、退出、重新登入才可生效。
複製程式碼

第二個錯誤的原因:

原因:無法建立本地執行緒問題,使用者最大可建立執行緒數太小

解決方案:切換到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. 常用的外掛主要包括: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請求的訪問。

二、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"
複製程式碼

相關文章