1 ik分詞的安裝
1.獲取ik分詞器安裝包:https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.12.1
選擇zip安裝包
2.進入es的組建目錄并解壓壓縮包
cd /docker/es/plugins
mkdir ik
cd ik
unzip elasticsearch-analysis-ik-7.12.1.zip
3.完成后重啟es
docker restart es
注意事項:安裝es的ik分詞器可能導(dǎo)致es內(nèi)存溢出秀鞭,可以調(diào)整虛擬機內(nèi)存到2G
Es中的類型
一級分類 | 二級分類 | 具體類型 |
---|---|---|
核心類型 | 字符串類型 | string,text,keyword |
整數(shù)類型 | integer,long,short,byte | |
浮點類型 | double,float,half_float,scaled_float | |
邏輯類型 | boolean | |
日期類型 | date | |
范圍類型 | range | |
二進制類型 | binary | |
復(fù)合類型 | 數(shù)組類型 | array |
對象類型 | object | |
嵌套類型 | nested | |
地理類型 | 地理坐標(biāo)類型 | geo_point |
地理地圖 | geo_shape | |
特殊類型 | IP類型 | ip |
范圍類型 | completion | |
令牌計數(shù)類型 | token_count | |
附件類型 | attachment | |
抽取類型 | percolator |
創(chuàng)建一個索引(IK需要提前配置好),然后通過golang組件姓迅,go-mysql-elasticsearch進行數(shù)據(jù)同步到es
PUT /products/
{
"mappings": {
"properties": {
"name":{
"type": "text",
"analyzer": "ik_smart"
},
"long_name":{
"type": "text",
"analyzer": "ik_smart"
},
"brand_id":{
"type": "integer"
},
"category_id":{
"type":"integer"
},
"shop_id":{
"type":"integer"
},
"price":{
"type":"scaled_float",
"scaling_factor":100
},
"sold_count":{
"type":"integer"
},
"review_count":{
"type":"integer"
},
"status":{
"type":"integer"
},
"create_time" : {
"type" : "date"
},
"last_time" : {
"type" : "date"
}
}
}
}
查看索引數(shù)據(jù)
GET /_cat/indices?v
可以看到當(dāng)前products索引下沒有數(shù)據(jù)
2 elasticsearch與mysql數(shù)據(jù)同步
2.1 go-mysql-elasticsearch簡介
go-mysql-elasticsearch是一款開源的高性能的Mysql數(shù)據(jù)同步ES的工具与境,其由go語言開發(fā)琳骡,編譯及使用非常簡單贩猎。go-mysql-elasticsearch的原理很簡單泌神,首先使用mysqldump獲取當(dāng)前MySQL的數(shù)據(jù)定血,然后在通過此時binlog的name和position獲取增量數(shù)據(jù)电爹,再根據(jù)binlog構(gòu)建restful api寫入數(shù)據(jù)到ES中恢筝。
注意:
1.mysql binlog必須是ROW模式哀卫。
2.要同步的mysql數(shù)據(jù)表必須包含主鍵,否則直接忽略滋恬,這是因為如果數(shù)據(jù)表沒有主鍵聊训,UPDATE和DELETE操作就會因為在ES中找不到對應(yīng)的document而無法進行同步。
3.不支持程序運行過程中修改表結(jié)構(gòu)恢氯。
2.2 安裝go-mysql-elasticsearch
1.拉取go-mysql-elasticsearch鏡像
docker pull gozer/go-mysql-elasticsearch
2.創(chuàng)建一個目錄用于存儲配置文件
mkdir /docker/go-mysql-es
cd /docker/go-mysql-es
touch go_mysql_river.toml
配置文件內(nèi)容如下
my_addr = "xx.xx.xx.xx:3306" --mysql地址與端口
my_user = "root" --mysql用戶
my_pass = "root" --mysql密碼
my_charset = "utf8" --字符集
enable-relay = true --中繼日志
es_addr = "xx.xx.xx.xx:9200" --es的地址與端口
es_user = "" --es用戶名
es_pass = "" --es密碼
data_dir = "/docker/data" --數(shù)據(jù)存儲目錄
stat_addr = "127.0.0.1:12800"
stat_path = "/metrics"
server_id = 1001 --注意別和mysql的server-id沖突
flavor = "mysql"
mysqldump = "" --備份文件
#skip_master_data = false
bulk_size = 128 --批量數(shù)據(jù)
flush_bulk_time = "200ms"
skip_no_pk_table = false
[[source]]
schema = "lmrs" --同步的數(shù)據(jù)庫
tables = ["lmrs_products"] --同步的表(可指定多個["lmrs_products","table2"]带斑,當(dāng)前指定一個)
[[rule]] --過濾字段
schema = "lmrs_2008_shops" --同步的數(shù)據(jù)庫
table = "lmrs_products" --同步的表
index = "products" --同步的es索引
type = "_doc" --同步的es類型
# Only sync following columns
filter = ["id", "name","long_name","brand_id","shop_id","price","sold_count","review_count","status","create_time","last_time","three_category_id"] --哪些字段同步
[rule.filed]
mysql = "three_category_id" --mysql的three_category_id替換es的category_id
elastic = "category_id"
3.構(gòu)建go-mysql-elasticsearch容器
docker run -p 12345:12345 -d --name go-mysql-es -v /docker/go-mysql-es/go_mysql_river.toml:/config/river.toml:ro --privileged=true gozer/go-mysql-elasticsearch
正常啟動后查看es索引的數(shù)據(jù)
GET /_cat/indices?v
手動在數(shù)據(jù)庫中新增一條記錄,繼續(xù)查看索引數(shù)據(jù)
再刪除兩條數(shù)據(jù)勋拟,繼續(xù)查看索引數(shù)據(jù)