ElasticSearch 淺入

1 ElasticSearch簡介

1.1 什麼是ElasticSearch

Elasticsearch是一個實時的分佈式搜索和分析引擎。它可以幫助你用前所未有的速度去處理大規模數據。ElasticSearch是一個基於Lucene的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java開發的,並作爲Apache許可條款下的開放源碼發佈,是當前流行的企業級搜索引擎。設計用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。

1.2 ElasticSearch特點

(1)可以作爲一個大型分佈式集羣(數百臺服務器)技術,處理PB級數據,服務大公司;也可以運行在單機上
(2)將全文檢索、數據分析以及分佈式技術,合併在了一起,才形成了獨一無二的ES;
(3)開箱即用的,部署簡單
(4)全文檢索,同義詞處理,相關度排名,複雜數據分析,海量數據的近實時處理

1.3 ElasticSearch體系結構

下表是Elasticsearch與MySQL數據庫邏輯結構概念的對比

Elasticsearch 關係型數據庫Mysql
索引(index) 數據庫(databases)
類型(type) 表(table)
文檔(document) 行(row)

2 走進ElasticSearch

2.1 ElasticSearch部署與啓動

下載ElasticSearch 5.6.8版本,無需安裝,解壓安裝包後即可使用,在命令提示符下,進入ElasticSearch安裝目錄下的bin目錄,執行命令(如果輸入elasticsearch 報沒有相關命令錯,配置elasticsearch的環境變量,也就是安裝包的bin目錄)

elasticsearch

即可啓動,我們打開瀏覽器,在地址欄輸入http://127.0.0.1:9200/ 即可看到輸出結果,注意elasticsearch啓用了兩個端口,9200端口是給除java應用以外的REST用的,java應用所用的端口是9300端口。

{
    "name" : "uV2glMR",
    "cluster_name" : "elasticsearch",
    "cluster_uuid" : "RdV7UTQZT1‐Jnka9dDPsFg",
    "version" : {
        "number" : "5.6.8",
        "build_hash" : "688ecce",
        "build_date" : "2018‐02‐16T16:46:30.010Z",
        "build_snapshot" : false,
        "lucene_version" : "6.6.1"
    },
    "tagline" : "You Know, for Search"
}

2.2 Postman調用RestAPI

2.2.1 新建索引

要創建一個叫articleindex的索引 ,就以put方式提交  http://127.0.0.1:9200/articleindex/

2.2.2 新建文檔

post方式提交  http://127.0.0.1:9200/articleindex/article,將自動創建type爲article的文檔

//參數
{
    "title":"SpringBoot2.0",
    "content":"發佈啦"
}

返回結果如下:

{
    "_index": "articleindex",
    "_type": "article",
    "_id": "AWPKsdh0FdLZnId5S_F9",
    "_version": 1,
    "result": "created",
    "_shards": 
    {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "created": true
}

_id是由系統自動生成的。

2.2.3 查詢全部文檔

查詢某索引某類型的全部數據,以get方式請求 http://127.0.0.1:9200/articleindex/article/_search 返回結果如下

{
    "took": 5,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 2,
        "max_score": 1,
        "hits": [
            {
                "_index": "articleindex",
                "_type": "article",
                "_id": "AWPKrI4pFdLZnId5S_F7",
                "_score": 1,
                "_source": {
                    "title": "SpringBoot2.0",
                    "content": "發佈啦"
                }
            },
            {
                "_index": "articleindex",
                "_type": "article",
                "_id": "AWPKsdh0FdLZnId5S_F9",
                "_score": 1,
                "_source": {
                    "title": "elasticsearch入門",
                    "content": "零基礎入門"
                }
            }
        ]
    }
}

2.2.4 修改文檔

put形式提交以下地址:http://127.0.0.1:9200/articleindex/article/AWPKrI4pFdLZnId5S_F7(ID存在)

//參數
{
    "title":"SpringBoot2.0正式版",
    "content":"發佈了嗎"
}

返回結果: 

{
    "_index": "articleindex",
    "_type": "article",
    "_id": "AWPKsdh0FdLZnId5S_F9",
    "_version": 2,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "created": false
}

如果我們在地址中的ID不存在,則會創建新文檔,以put形式提交地址:http://127.0.0.1:9200/articleindex/article/1

//參數
{
    "title":"LOL十週年紀念",
    "content":"皮膚免費領"
}

返回信息:

{
	"_index": "articleindex",
	"_type": "article",
	"_id": "1",
	"_version": 1,
	"result": "created",
	"_shards": {
		"total": 2,
		"successful": 1,
		"failed":     
	},
	"created": true
}

再次查詢,看是否有新增的這條文檔

2.2.5 按ID查詢文檔

GET方式請求  http://127.0.0.1:9200/articleindex/article/1 (ID已存在)

2.2.6 基本匹配查詢

根據某列進行查詢 get方式提交下列地址:

http://127.0.0.1:9200/articleindex/article/_search?q=title:"LOL十週年紀念"

{
    "took": 10,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 2.0649285,
        "hits": [
            {
                "_index": "articleindex",
                "_type": "article",
                "_id": "1",
                "_score": 2.0649285,
                "_source": {
                    "title": "LOL十週年紀念",
                    "content": "皮膚免費領"
                }
            }
        ]
    }
}

2.2.7 模糊查詢

我們可以用*代表任意字符:
http://127.0.0.1:9200/articleindex/article/_search?q=title:“*週年*”

2.2.8 刪除文檔

根據ID刪除文檔,刪除ID爲1的文檔 DELETE方式提交 http://127.0.0.1:9200/articleindex/article/1

返回結果如下:

{
    "found": true,
    "_index": "articleindex",
    "_type": "article",
    "_id": "1",
    "_version": 2,
    "result": "deleted",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    }
}

再次查看全部是否還存在此記錄

3 Head插件的安裝與使用

3.1 Head插件安裝

如果都是通過rest請求的方式使用Elasticsearch,未免太過麻煩,而且也不夠人性化。一般都會使用圖形化界面來實現Elasticsearch的日常管理,最常用的就是Head插件
步驟1:下載head插件:https://github.com/mobz/elasticsearch-head
步驟2:解壓到任意目錄,但是要和elasticsearch的安裝目錄區別開。
步驟3:安裝node js ,安裝cnpm

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

步驟4:將grunt安裝爲全局命令 。Grunt是基於Node.js的項目構建工具。它可以自動運行你所設定的任務

npm install ‐g grunt‐cli

步驟5:安裝依賴

cnpm install

步驟6:進入head目錄啓動head,在命令提示符下輸入命令

grunt server

如果輸入grunt server 報沒有相關命令錯,配置head的環境變量,這是因爲我們雖然已經安裝了grunt,但是沒有指定正確的環境變量Path(用戶變量或系統變量)。

 例如,在我的系統中,gurnt.cmd 在 "C:\Program Files\nodejs\node_global"

那麼,你可以在 "用戶變量"或"系統變量"的Path 指定路徑。

 關閉後,重新啓動cmd運行即可。

步驟7:打開瀏覽器,輸入 http://localhost:9100
步驟8:點擊連接按鈕沒有任何相應,按F12發現有如下錯誤No 'Access-Control-Allow-Origin' header is present on the requested resource這個錯誤是由於elasticsearch默認不允許跨域調用,而elasticsearch-head是屬於前端工程,所以報錯。我們這時需要修改elasticsearch的配置,讓其允許跨域訪問。
修改elasticsearch配置文件:elasticsearch.yml,增加以下兩句命令:

http.cors.enabled: true
http.cors.allow-origin: "*"

此步爲允許elasticsearch跨越訪問 點擊連接即可看到相關信息

3.2 Head插件操作

3.2.1 新建索引

選擇“索引”選項卡,點擊“新建索引”按鈕

輸入索引名稱點擊OK,若是長時間沒反應,重啓一下elastcisearch,再重建索引

3.2.2 新建或修改文檔

在複合查詢中提交地址,輸入內容,提交方式爲PUT,如果ID不存在(此次3不存在),就是創建文檔。
 點擊數據瀏覽 ,點擊要查詢的索引名稱,右側窗格中顯示文檔信息

 

我們再次回到剛纔的界面

修改數據後重新提交請求 , 此時因爲ID已經存在,所以執行的是修改操作,重新查詢此記錄,發現版本爲2 。也就是說每次修改後版本都會增加1.

 3.2.3 搜索文檔

 3.2.4 刪除文檔

 

4 IK分詞器

4.1什麼是IK分詞器

分詞:即把一段中文或者別的劃分成一個個的關鍵字,我們在搜索時候會把自己的信息進行分詞,會把數據庫中或者索引庫中的數據進行分詞,然後進行一個匹配操作,默認的中文分詞是將每個字看成一個詞,這顯然是不符合要求的。

http://127.0.0.1:9200/_analyze?analyzer=chinese&pretty=true&text=我是程序員,瀏覽器顯示效果如下

{
    "tokens" : [
        {
            "token" : "我",
            "start_offset" : 0,
            "end_offset" : 1,
            "type" : "<IDEOGRAPHIC>",
            "position" : 0
        },
        {
            "token" : "是",
            "start_offset" : 1,
            "end_offset" : 2,
            "type" : "<IDEOGRAPHIC>",
            "position" : 1
        },
        {
            "token" : "程",
            "start_offset" : 2,
            "end_offset" : 3,
            "type" : "<IDEOGRAPHIC>",
            "position" : 2
        },
        {
            "token" : "序",
            "start_offset" : 3,
            "end_offset" : 4,
            "type" : "<IDEOGRAPHIC>",
            "position" : 3
        },
        {
            "token" : "員",
            "start_offset" : 4,
            "end_offset" : 5,
            "type" : "<IDEOGRAPHIC>",
            "position" : 4
        }
    ]
}

 所以我們需要安裝中文分詞器來解決這個問題。IK分詞是一款國人開發的相對簡單的中文分詞器。雖然開發者自2012年之後就不在維護了,但在工程應用中IK算是比較流行的一款!

4.2 IK分詞器安裝

下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases

(1)先將其解壓,將解壓後的elasticsearch文件夾重命名文件夾爲ik
(2)將ik文件夾拷貝到elasticsearch/plugins 目錄下。
(3)重新啓動,即可加載IK分詞器

4.3 IK分詞器測試

IK提供了兩個分詞算法ik_smart 和 ik_max_word 其中 ik_smart 爲最少切分ik_max_word爲最細粒度劃分

(1)最小切分

在瀏覽器地址欄輸入地址  http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序員
輸出的結果爲:

{
    "tokens" : [
        {
            "token" : "我",
            "start_offset" : 0,
            "end_offset" : 1,
            "type" : "CN_CHAR",
            "position" : 0
        },
        {
            "token" : "是",
            "start_offset" : 1,
            "end_offset" : 2,
            "type" : "CN_CHAR",
            "position" : 1
        },
        {
            "token" : "程序員",
            "start_offset" : 2,
            "end_offset" : 5,
            "type" : "CN_WORD",
            "position" : 2
        }
    ]
}

(2)最細切分

在瀏覽器地址欄輸入地址http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序員

輸出的結果爲:

{
    "tokens" : [
        {
            "token" : "我",
            "start_offset" : 0,
            "end_offset" : 1,
            "type" : "CN_CHAR",
            "position" : 0
        },
        {
            "token" : "是",
            "start_offset" : 1,
            "end_offset" : 2,
            "type" : "CN_CHAR",
            "position" : 1
        },
        {
            "token" : "程序員",
            "start_offset" : 2,
            "end_offset" : 5,
            "type" : "CN_WORD",
            "position" : 2
        },
        {
            "token" : "程序",
            "start_offset" : 2,
            "end_offset" : 4,
            "type" : "CN_WORD",
            "position" : 3
        },
        {
            "token" : "員",
            "start_offset" : 4,
            "end_offset" : 5,
            "type" : "CN_CHAR",
            "position" : 4
        }
    ]
}

4.4 自定義詞庫

我們現在測試"科藍張欣",瀏覽器的測試效果如下
http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=科藍張欣

{
    "tokens": [
        {
            "token": "科",
            "start_offset": 0,
            "end_offset": 1,
            "type": "CN_CHAR",
            "position": 0
        },
        {
            "token": "藍",
            "start_offset": 1,
            "end_offset": 2,
            "type": "CN_CHAR",
            "position": 1
        },
        {
            "token": "張",
            "start_offset": 2,
            "end_offset": 3,
            "type": "CN_CHAR",
            "position": 2
        },
        {
            "token": "欣",
            "start_offset": 3,
            "end_offset": 4,
            "type": "CN_CHAR",
            "position": 3
        }
    ]
}

默認的分詞並沒有識別“科藍張欣”是一個詞。如果我們想讓系統識別“科藍張欣”是一個詞,需要編輯自定義詞庫。
步驟:
(1)進入elasticsearch/plugins/ik/config目錄

(2)新建一個my.dic文件,編輯內容:科藍張欣

(3)修改IKAnalyzer.cfg.xml(在ik/config目錄下)

<properties>
    <comment>IK Analyzer 擴展配置</comment>
    <!‐‐用戶可以在這裏配置自己的擴展字典 ‐‐>
    <entry key="ext_dict">my.dic</entry>
    <!‐‐用戶可以在這裏配置自己的擴展停止詞字典‐‐>
    <entry key="ext_stopwords"></entry>
</properties>

重新啓動elasticsearch,通過瀏覽器測試分詞效果

{
    "tokens": [
        {
            "token": "科藍張欣",
            "start_offset": 0,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 0
        }
    ]
}

5 搜索微服務開發

5.1 模塊搭建

(1)創建模塊tensquare_search ,pom.xml引入依賴

<dependencies>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-elasticsearch</artifactId>
    </dependency>
    <dependency>
		<groupId>com.tensquare</groupId>
		<artifactId>tensquare_common</artifactId>
		<version>1.0-SNAPSHOT</version>
	</dependency>
</dependencies>

(2)application.yml

#配置tomcat端口
server.port: 9007
#指定應用名
spring:
  application:
    name: tensquare-search
  #索引庫配置
  data:
    elasticsearch:
      cluster-nodes: 127.0.0.1:9300

(3)創建包com.tensquare.search ,包下創建啓動類

@SpringBootApplication
public class RecruitApplication {
    public static void main(String[] args) {
        SpringApplication.run(RecruitApplication.class, args);
    } 
    @Bean
    public IdWorker idWorkker(){
        return new IdWorker(1, 1);
    }
}

5.2  添加文章(添加:測試搜索服務功能,沒實際作用)

(1)創建實體類創建com.tensquare.search.pojo包,包下建立類

@Document(indexName = "tensquare_article",type = "article")
public class Article implements Serializable{
    @Id
    private String id;
    /**
     * 是否索引:是否能夠搜索
     * 是否分詞:是否能夠全部匹配,部分匹配
     * ik_max_word爲最細粒度劃分
     * 是否存儲:是否能夠頁面顯示 這些寫入的屬性都表示要存儲
     */
    @Field(index = true,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String title;
    @Field(index = true,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String  content;
    //是否能夠被查詢的條件
    private String state;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

}

(2)創建數據訪問接口

創建com.tensquare.search.dao包,包下建立接口

/**
* 文章數據訪問層接口
*/
public interface ArticleSearchDao extends
ElasticsearchRepository<Article,String> {
}

(3)創建業務邏輯類

創建com.tensquare.search.service包,包下建立類

@Service
public class ArticleSearchService {
    @Autowired
    private ArticleSearchDao articleSearchDao;
    /**
    * 增加文章
    * @param article
    */
    public void add(Article article){
        articleSearchDao.save(article);
    }
}

(4)創建控制器類
創建com.tensquare.search.controller包,包下建立類

@RestController
@CrossOrigin
@RequestMapping("/article")
public class ArticleSearchController {
    @Autowired
    private ArticleSearchService articleSearchService;
    @RequestMapping(method= RequestMethod.POST)
    public Result save(@RequestBody Article article){
        articleSearchService.save(article);
        return new Result(true, StatusCode.OK, "操作成功");
    }
}

5.3 文章搜索

(1)ArticleSearchRepository新增方法定義

/**
* 檢索
* @param
* @return
*/
public Page<Article> findByTitleOrLikeContentLike(String title, String
content, Pageable pageable);

(2)ArticleSearchService新增方法

public Page<Article> findByKey(String keywords, int page, int size)
{
    PageRequest pageRequest = PageRequest.of(page‐1, size);
    return articleSearchRepository.findByTitleLikeOrContentLike(keywords,keywords,pageRequest);
}

(3)ArticleSearchController方法

@RequestMapping(value="/search/{keywords}/{page}/{size}",method=
RequestMethod.GET)
public Result findByKey(@PathVariable String keywords,
   @PathVariable int page, @PathVariable int size){
    Page<Article> articlePage =articleSearchService.findByKey(keywords,page,size);
    return new Result(true, StatusCode.OK, "查詢成功",
    new PageResult<Article>(articlePage.getTotalElements(),articlePage.getContent()));    
}

(4)測試

現在elasticsearch中有如下數據

啓動springboot程序,然後瀏覽器輸入地址

http://localhost:9007/article/search/我是程序員/1/6

結果顯示 

{
    "code": 20000,
    "flag": true,
    "message": "查詢成功",
    "data": {
        "total": 5,
        "rows": [
            {
                "id": "12",
                "title": "java程序員",
                "content": "java程序員",
                "state": null
            },
            {
                "id": "19",
                "title": "php程序",
                "content": "我是一個工程師",
                "state": null
            },
            {
                "id": "13",
                "title": "java編程",
                "content": "Java程序員",
                "state": null
            },
            {
                "id": "14",
                "title": "一員大將",
                "content": "科藍凱倫",
                "state": null
            },
            {
                "id": "17",
                "title": "測試人員",
                "content": "lily",
                "state": null
            }
        ]
    }
}

 結果分析:由於ik分詞器的最細切分,把'我是程序員'分爲幾個關鍵字:'我','是','程序員','程序','員'。由於方法findByTitleOrLikeContentLike根據內容或標題的模糊查詢,所以會出現上述五條結果。

6 elasticsearch與MySQL數據同步

6.1 Logstash

6.1.1什麼是Logstash

Logstash是一款輕量級的日誌蒐集處理框架,可以方便的把分散的、多樣化的日誌蒐集起來,並進行自定義的處理,然後傳輸到指定的位置,比如某個服務器或者文件.。

6.1.2 Logstash安裝與測試解壓,進入bin目錄

logstash ‐e 'input { stdin { } } output { stdout {} }'

控制檯輸入字符,隨後就有日誌輸出

stdin,表示輸入流,指從鍵盤輸入,stdout,表示輸出流,指從顯示器輸出命令行參數:-e 執行--config 或 -f 配置文件,後跟參數類型可以是一個字符串的配置或全路徑文件名或全路徑(如:/etc/logstash.d/,logstash會自動讀取/etc/logstash.d/目錄下所有*.conf 的文本文件,然後在自己內存裏拼接成一個完整的大配置文件再去執行)

6.2 MySQL數據導入Elasticsearch

(1)在logstash-5.6.8安裝目錄下創建文件夾mysqletc (名稱隨意)
(2)文件夾下創建mysql.conf (名稱隨意) ,內容如下:

input {
  jdbc {
      # mysql jdbc connection string to our backup databse
      jdbc_connection_string => "jdbc:mysql://192.168.92.132:3306/tensquare_article?useUnicode=true&characterEncoding=UTF8"
      # the user we wish to excute our statement as
      jdbc_user => "root"
      jdbc_password => "123456"
      # the path to our downloaded jdbc driver 驅動包的路徑
      jdbc_driver_library => "D:/software/public/logstash-5.6.8/mysqletc/mysql-connector-java-5.1.46.jar"
      # the name of the driver class for mysql 驅動類名
      jdbc_driver_class => "com.mysql.jdbc.Driver"
      jdbc_paging_enabled => "true"
      jdbc_page_size => "50"
      #以下對應着要執行的sql的絕對路徑。
      #statement_filepath => ""
      statement => "select id,title,content from tb_article where state='0'"
      #定時字段 各字段含義(由左至右)分、時、天、月、年,全部爲*默認含義爲每分鐘都更新
      schedule => "* * * * *"
  }
}

output {
  elasticsearch {
      #ESIP地址與端口
      hosts => "127.0.0.1:9200" 
      #ES索引名稱(自己定義的)
      index => "tensquare_article"
      #自增ID編號
      document_id => "%{id}"
      document_type => "article"
  }
  stdout {
      #以JSON格式輸出
      codec => json_lines
  }
}

(3)將mysql驅動包mysql-connector-java-5.1.46.jar拷貝至D:/logstash-5.6.8/mysqletc/ 下 。D:/logstash-5.6.8是你的安裝目錄
(4)命令行下執行

logstash ‐f ../mysqletc/mysql.conf

觀察控制檯輸出,每間隔1分鐘就執行一次sql查詢。

再次刷新elasticsearch-head的數據顯示,看是否也更新了數據。

7 Elasticsearch Docker環境下安裝

7.1 容器的創建與遠程連接

(1)下載鏡像

docker pull elasticsearch:5.6.8

(2)創建容器

docker run ‐di ‐‐name=tensquare_elasticsearch ‐p 9200:9200 ‐p 9300:9300 elasticsearch:5.6.8

(3)瀏覽器輸入地址:http://192.168.184.134:9200/ 即可看到如下信息:

{
    "name" : "WmBn0H‐",
    "cluster_name" : "elasticsearch",
    "cluster_uuid" : "2g‐VVbm9Rty7J4sksZNJEg",
    "version" : {
        "number" : "5.6.8",
        "build_hash" : "688ecce",
        "build_date" : "2018‐02‐16T16:46:30.010Z",
        "build_snapshot" : false,
        "lucene_version" : "6.6.1"
    },
    "tagline" : "You Know, for Search"
}

(4)我們修改demo的application.yml

#配置tomcat端口
server.port: 9007
#指定應用名
spring:
  application:
    name: tensquare-search
  #索引庫配置
  data:
    elasticsearch:
      cluster-nodes: 192.168.92.132:9300

(5)運行測試程序,發現會報如下錯誤

NoNodeAvailableException[None of the configured nodes are available:
[{#transport#‐1}{exvgJLR‐RlCNMJy‐hzKtnA}{192.168.92.132:9300}{192.168.92.132:9300:9300}]]
at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodes
AreAvailable(TransportClientNodesService.java:347) at org.elasticsearch.client.transport.TransportClientNodesService.execute(Tra
nsportClientNodesService.java:245)at org.elasticsearch.client.transport.TransportProxyClient.execute(TransportP
roxyClient.java:59)

這是因爲elasticsearch從5版本以後默認不開啓遠程連接,需要修改配置文件
(6)我們進入容器

docker exec ‐it tensquare_elasticsearch /bin/bash

此時,我們看到elasticsearch所在的目錄爲/usr/share/elasticsearch ,進入config看到了配置文件elasticsearch.yml我們通過vi命令編輯此文件,尷尬的是容器並沒有vi命令 ,咋辦?我們需要以文件掛載的方式創建容器纔行,這樣我們就可以通過修改宿主機中的某個文件來實現對容器內配置文件的修改
(7)拷貝配置文件到宿主機

首先退出容器,然後執行命令:

docker cp tensquare_elasticsearch:/usr/share/elasticsearch/config/elasticsearch.yml /usr/share/elasticsearch.yml

(8)停止和刪除原來創建的容器

docker stop tensquare_elasticsearch
docker rm tensquare_elasticsearch

(9)重新執行創建容器命令

docker run ‐di ‐‐name=tensquare_elasticsearch ‐p 9200:9200 ‐p 9300:9300 ‐v /usr/share/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:5.6.8

(10)修改/usr/share/elasticsearch.yml 將 transport.host: 0.0.0.0 前的#去掉後保存文件退出。其作用是允許任何ip地址訪問elasticsearch .開發測試階段可以這麼做,生產環境下指定具體的IP
(11)重啓啓動

docker restart tensquare_elasticsearch

重啓後發現重啓啓動失敗了,這時什麼原因呢?這與我們剛纔修改的配置有關,因爲elasticsearch在啓動的時候會進行一些檢查,比如最多打開的文件的個數以及虛擬內存區域數量等等,如果你放開了此配置,意味着需要打開更多的文件以及虛擬內存,所以我們還需要系統調優
 (12)系統調優

我們一共需要修改兩處
修改/etc/security/limits.conf ,追加內容

* soft nofile 65536
* hard nofile 65536

nofile是單個進程允許打開的最大文件個數 soft nofile 是軟限制 hard nofile是硬限制,修改/etc/sysctl.conf,追加內容

vm.max_map_count=655360

限制一個進程可以擁有的VMA(虛擬內存區域)的數量,執行下面命令, 修改內核參數馬上生效

sysctl ‐p

(13)重新啓動虛擬機,再次啓動容器,發現已經可以啓動並遠程訪問

7.2 IK分詞器安裝

(1)快捷鍵alt+p進入sftp , 將ik文件夾上傳至宿主機。

sftp> put ‐r d:\setup\ik

(2)在宿主機中將ik文件夾拷貝到容器內 /usr/share/elasticsearch/plugins 目錄下。

docker cp ik tensquare_elasticsearch:/usr/share/elasticsearch/plugins/

(3)重新啓動,即可加載IK分詞器

docker restart tensquare_elasticsearch

7.3 HEAD插件安裝

(1)修改/usr/share/elasticsearch.yml ,添加允許跨域配置

http.cors.enabled: true
http.cors.allow-origin: "*"

(2)重新啓動elasticseach容器
(3)下載head鏡像(此步省略)

docker pull mobz/elasticsearch‐head:5

(4)創建head容器

docker run ‐di ‐‐name=myhead ‐p 9100:9100 mobz/elasticsearch‐head:5

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章