天天看點

ElasticSearch 本地快速搭建與使用

文章目錄

      • ElasticSearch 簡介
      • 下載下傳并運作ElasticSearch
      • 在Windows上運作ElasticSearch
      • 安裝ik中文分詞器
      • ik測試使用
      • 安裝ElasticSearch的Head插件
      • Linux安裝ElasticSearch
      • java中使用elastaicsearch(RestHighLevelClient)

ElasticSearch 簡介

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

下載下傳并運作ElasticSearch

ElasticSearch可以從elasticsearch.org下載下傳對應的檔案格式,如ZIP和TAR.GZ。下載下傳并提取一個運作它的軟體包之後不會容易得多,需要提前安裝Java運作時環境。

下載下傳連結 https://www.elastic.co/products/elasticsearch

在Windows上運作ElasticSearch

  • 從指令視窗運作位于bin檔案夾中的elasticsearch.bat。這将會啟動ElasticSearch在控制台的前台運作,這意味着我們可在控制台中看到運作資訊或一些錯誤資訊,并可以使用CTRL + C停止或關閉它。
  • 在啟動過程中,ElasticSearch的執行個體運作會占用大量的記憶體,是以在這一過程中,電腦會變得比較慢,需要耐心等待,啟動加載完成後電腦就可以正常使用了
  • 當ElasticSearch的執行個體并運作,您可以使用http://localhost:9200檢查是否運作成功

安裝ik中文分詞器

下載下傳位址:https://github.com/medcl/elasticsearch-analysis-ik/releases
  • 選擇和已經下載下傳的elasticsearch版本相容的ik。
  • 解壓後複制

    elasticsearch/plugins

    目錄下
  • 重新運作

    elasticsearch.bat

ik測試使用

可以使用谷歌的

Postman

工具測試
ElasticSearch 本地快速搭建與使用

建立一個索引:

curl -XPUT http://localhost:9200/index
           

建立一個映射

curl -XPOST http://localhost:9200/index/fulltext/_mapping -H 'Content-Type:application/json' -d'
{
        "properties": {
            "content": {
                "type": "text",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_max_word"
            }
        }

}'
           

添加索引文檔測試資料

curl -XPOST http://localhost:9200/index/fulltext/1 -H 'Content-Type:application/json' -d'
{"content":"美國留給伊拉克的是個爛攤子嗎"}

curl -XPOST http://localhost:9200/index/fulltext/2 -H 'Content-Type:application/json' -d'
{"content":"公安部:各地校車将享最高路權"}

curl -XPOST http://localhost:9200/index/fulltext/3 -H 'Content-Type:application/json' -d'
{"content":"中韓漁警沖突調查:韓警平均每天扣1艘中國漁船"}

curl -XPOST http://localhost:9200/index/fulltext/4 -H 'Content-Type:application/json' -d'
{"content":"中國駐洛杉矶領事館遭亞裔男子槍擊 嫌犯已自首"}
           

查詢突出顯示

curl -XPOST http://localhost:9200/index/fulltext/_search  -H 'Content-Type:application/json' -d'
{
    "query" : { "match" : { "content" : "中國" }},
    "highlight" : {
        "pre_tags" : ["<tag1>", "<tag2>"],
        "post_tags" : ["</tag1>", "</tag2>"],
        "fields" : {
            "content" : {}
        }
    }
}

傳回結果

{
    "took": 14,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 2,
        "max_score": 2,
        "hits": [
            {
                "_index": "index",
                "_type": "fulltext",
                "_id": "4",
                "_score": 2,
                "_source": {
                    "content": "中國駐洛杉矶領事館遭亞裔男子槍擊 嫌犯已自首"
                },
                "highlight": {
                    "content": [
                        "<tag1>中國</tag1>駐洛杉矶領事館遭亞裔男子槍擊 嫌犯已自首 "
                    ]
                }
            },
            {
                "_index": "index",
                "_type": "fulltext",
                "_id": "3",
                "_score": 2,
                "_source": {
                    "content": "中韓漁警沖突調查:韓警平均每天扣1艘中國漁船"
                },
                "highlight": {
                    "content": [
                        "均每天扣1艘<tag1>中國</tag1>漁船 "
                    ]
                }
            }
        ]
    }
}
           

安裝ElasticSearch的Head插件

安裝head需要安裝node和grunt

  • 安裝nodejs:https://nodejs.org/en/download
  • 安裝grunt:

    npm install -g grunt-cli

    安裝完成後執行grunt -version檢視是否安裝成功,會顯示安裝的版本号

修改elasticsearch.yml檔案

去掉network.host: 192.168.0.1的注釋并改為network.host: 0.0.0.0,

去掉cluster.name;node.name;http.port的注釋

在檔案的末尾加入以下代碼:

http.cors.enabled: true 
http.cors.allow-origin: "*"
node.master: true
node.data: true
           
  • 安裝head: 下載下傳位址 https://github.com/mobz/elasticsearch-head 。解壓後 執行

    npm install

    安裝完成後執行

    grunt server

    或者

    npm run start

    運作

    head

    插件,如果不成功重新安裝

    grunt

    。通路界面 http://localhost:9100/
    ElasticSearch 本地快速搭建與使用

Linux安裝ElasticSearch

https://blog.csdn.net/weixin_41615494/article/details/79591335

通路elasticSearch官網位址 https://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

ElasticSearch 本地快速搭建與使用

因為安全問題elasticsearch 不讓用root使用者直接運作,是以要建立新使用者。

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

#給新建立使用者檔案夾執行權限
chown -R es:es /usr/local/elasticsearch

切換es使用者:su es

啟動叢集指令:
cd  /usr/local/elasticsearch
bin/elasticsearch
           

在es使用者下啟動時報錯

ElasticSearch 本地快速搭建與使用
原因: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
           
ElasticSearch 本地快速搭建與使用

第一個問題的原因:

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

解決方案:切換到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/

#背景啟動
[[email protected] elasticsearch-6.4.0]$ ./bin/elasticsearch -d
[[email protected] elasticsearch-6.4.0]$ jps
27587 Jps
27573 Elasticsearch
           

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();
        }
    }
}

           

繼續閱讀