macOS下使用elasticsearch+elasticsearch-head+logstash+ik分詞器+mysql數據同步教程

使用教程

使用中間件及軟件版本

序號 中間件或軟件 版本
1 elasticsearch 7.6.2
2 logstash 7.6.2
3 mysql 8+
4 JDK 11
5 mysql-connector-java 8.0.19

安裝elasticsearch

  1. elasticsearch下載地址 elasticsearch爲:https://www.elastic.co/cn/downloads/elasticsearch
  2. 下載後解壓到指定文件夾
  3. 切換到config文件夾下,編輯elasticsearch.yml文件,讓其支持外網IP及elasticsearch-head跨域訪問,詳細配置如下:

支持外網IP訪問配置:(如果不需要,則不配置即可)

network.host: 0.0.0.0
http.port: 9200

支持elasticsearch-head跨域訪問配置:

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

切換到bin文件下,使用:./elasticsearch直接啓動elasticsearch

  1. 下載elasticsearch-head
git clone https://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install // 速度慢的可以安裝cnpm來代替或者yarn也可以,建議是cnpm
npm run start
  1. 然後訪問http://127.0.0.1:9100接口看到界面

直接使用提供的plugin安裝elasticsearch-head會報錯,下載後解壓也會報錯,原因是因爲node和npm環境問題,需要配置的東西略多,故方式是直接從github上拉取源碼,按照上面的步驟4走即可。(任何形式的解壓elasticsearch-head到plugins或者modules文件夾下都會導致elasticsearch啓動失敗)

也可以將elasticsearch-head clone到elasticsearch根目錄下面,然後npm install安裝依賴,然後更改elasticsearch-head根目錄下的Gruntfile.js的

connect: {
	server: {
		options: {
			port: 9100,
			base: '.',
			keepalive: true
		}
	}
}

connect: {
	server: {
		options: {
			port: 9100,
			hostname: '*',
			base: '.',
			keepalive: true
		}
	}
}

啓動elasticsearch後再啓動head即可。

到此,安裝教程就已經基本完成

安裝中文分詞器

  1. 前往分詞下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases 下載對應版本的分詞器
  2. 在編輯elasticsearch下的plugins文件夾創建叫“ik”的文件夾,然後解壓壓縮包到ik文件夾下,重啓elasticsearch即可

elasticsearch-head使用教程

  1. 打開在瀏覽器打開head後,查看elasticsearch集羣連接是否健康,green或者yellow爲正常
  2. 確保正常後,點擊“索引”選項卡創建一個名爲myword的索引
  3. “基本查詢”使用補齊,處於待完善狀態
  4. 點擊“複合查詢”使用,主要是爲了測試中文分詞器ik的使用,然後點擊“查詢”,在第一個輸入框輸入elasticsearch服務地址,默認爲:http://localhost:9200/ ,第二個輸入框爲請求及操作方式,然後基於剛剛創建的索引myword進行分詞分析,輸入:

不使用ik分詞器的情況:

POST myword/_analyze 

第三個輸入框輸入的爲json數據,測試數據如下:

{
  "text": "我是中國人"
}

點擊“提交請求”,未啓用ik分詞時的效果如下:

{
	"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分詞器的情況:
其他方式都一致,唯一區別就是請求的json數據換成如下的數據

{
	"analyzer": "ik_max_word",
	"text": "我是中國人"
}

其中特意申明瞭分詞器analyzer類型爲:ik_max_word,意思爲啓用ik分詞器,提交請求後結果如下:

{
	"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": 3,
			"end_offset": 5,
			"type": "CN_WORD",
			"position": 4
		}
	]
}

很明顯結果就跟使用默認的分詞器有很大的區別,分詞得更加的恰當。對於上面兩個分詞效果的解釋:

  1. 如果未安裝ik分詞器,那麼,你如果寫 “analyzer”: “ik_max_word”,那麼程序就會報錯,因爲你沒有安裝ik分詞器
  2. 如果你安裝了ik分詞器之後,你不指定分詞器,不加上 “analyzer”: “ik_max_word” 這句話,那麼其分詞效果跟你沒有安裝ik分詞器是一致的,也是分詞成每個漢字。

關於ik分詞器的分詞類型(可以根據需求進行選擇):

ik_max_word:會將文本做最細粒度的拆分,比如會將“中華人民共和國國歌”拆分爲“中華人民共和國,中華人民,中華,華人,人民共和國,人民,人,民,共和國,共和,和,國國,國歌”,會窮盡各種可能的組合;

ik_smart:會做最粗粒度的拆分,比如會將“中華人民共和國國歌”拆分爲“中華人民共和國,國歌”。請求json如下(post):

創建名爲myword_test的索引;

POST myword_test/_analyze

{
  "analyzer": "ik_smart",
  "text": "我們都是很愛國的青年。"
}

結果如下:

{
	"tokens": [{
			"token": "我們",
			"start_offset": 0,
			"end_offset": 2,
			"type": "CN_WORD",
			"position": 0
		},
		{
			"token": "都是",
			"start_offset": 2,
			"end_offset": 4,
			"type": "CN_WORD",
			"position": 1
		},
		{
			"token": "很",
			"start_offset": 4,
			"end_offset": 5,
			"type": "CN_CHAR",
			"position": 2
		},
		{
			"token": "愛國",
			"start_offset": 5,
			"end_offset": 7,
			"type": "CN_WORD",
			"position": 3
		},
		{
			"token": "的",
			"start_offset": 7,
			"end_offset": 8,
			"type": "CN_CHAR",
			"position": 4
		},
		{
			"token": "青年",
			"start_offset": 8,
			"end_offset": 10,
			"type": "CN_WORD",
			"position": 5
		}
	]
}

安裝logstash使用及同步mysql數據到elasticsearch中

  1. logstash下載鏈接地址:https://www.elastic.co/cn/downloads/logstash

  2. 解壓即可,網上說需要安裝logstash-input-jdbc,但是在安裝過程中,logstash提示已經提供了相關插件,不再需要安裝了,直接使用默認的即可。

  3. 在logstash的根目錄下創建一個叫“mysql”的文件夾,用來存放mysql驅動文件,驅動文件要求與mysql的版本要能匹配,不然會導致驅動不一致導致連接失敗的情況

  4. 在config文件夾下創建jdbc.conf,配置內容如下:

# logstash同步mysql數據庫到elasticsearch
input {
    stdin {
    }
    jdbc {
        type =>"search-education"
        # mysql 數據庫鏈接
        jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/itaoke"
        # 用戶名和密碼
        jdbc_user => "root"
        jdbc_password => "jiangyun1992"
        jdbc_driver_library => "/Users/jiangyun/DevSoftware/logstash-7.6.2/mysql/mysql-connector-java-8.0.19.jar"
        jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
        jdbc_paging_enabled => "true"
        jdbc_page_size => "50000"
        # 執行的sql 就是上一步創建的sql文件的絕對路徑+文件名字,用於同步表的數據
        statement_filepath => "/Users/jiangyun/DevSoftware/logstash-7.6.2/mysql/search-education.sql"
        # 設置監聽間隔  各字段含義(由左至右)分、時、天、月、年,全部爲*默認含義爲每分鐘都更新
        schedule => "* * * * *"
    }

    jdbc {
          type =>"search-blog"
          # mysql 數據庫鏈接
          jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/iwiteks_taoke_manager"
          # 用戶名和密碼
          jdbc_user => "root"
          jdbc_password => "jiangyun1992"
          jdbc_driver_library => "/Users/jiangyun/DevSoftware/logstash-7.6.2/mysql/mysql-connector-java-8.0.19.jar"
          jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
          jdbc_paging_enabled => "true"
          jdbc_page_size => "50000"
          # 執行的sql 就是上一步創建的sql文件的絕對路徑+文件名字
          statement_filepath => "/Users/jiangyun/DevSoftware/logstash-7.6.2/mysql/search-blog.sql"
          # 設置監聽間隔  各字段含義(由左至右)分、時、天、月、年,全部爲*默認含義爲每分鐘都更新
          schedule => "* * * * *"
        }
}

filter {
    json {
        source => "message"
        remove_field => ["message"]
    }
}

output {
if [type]=="search-education"{
    elasticsearch {
        # ES的IP地址及端口
        hosts => ["127.0.0.1:9200"]
        index => "search-education"
        #user => "elastic"
        #password => "123456"
        # 索引名稱
        # 自增ID id必須是待查詢的數據表的序列字段
        document_id => "%{id}"
        }
    }
    if [type]=="search-blog"{
        elasticsearch {
            hosts => ["127.0.0.1:9200"]
            index => "search-blog"
            document_id => "%{id}"
        }
     }
    stdout {
       # JSON格式輸出
        codec => json_lines
    }
}
  1. 在剛剛創建的mysql文件夾下新建兩個jdbc中使用到的sql腳本文件

search-education.sql:

SELECT * FROM organization

search-blog.sql:

SELECT * FROM basic_web_template
  1. 啓動logstash命令與直接啓動方式不一樣,需要攜帶jdbc的配置文件中的配置到運行環境中,命令如下:

切換到logstash的bin目錄下執行(建議直接寫成shell腳本吧,每次都得攜帶參數執行命令,用起來麻煩)

./logstash -f ../config/jdbc.conf

啓動一分鐘後就能看到啓動logstash的窗口打印同步數據日誌了

  1. 到elasticsearch-head中點擊“數據瀏覽”選項卡中點擊指定的索引瀏覽即可,至於怎麼使用head來進行簡單或複合查詢,後期再補全吧
    在這裏插入圖片描述

至此,基本完成了整個配置,數據同步爲單張表,怎麼做的更好就交給大家了,後面有空加上springboot集成es使用及追加kibana使用。

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