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分词器可能导致es内存溢出,可以调整虚拟机内存到2G
Es中的类型
一级分类 | 二级分类 | 具体类型 |
---|---|---|
核心类型 | 字符串类型 | string,text,keyword |
整数类型 | integer,long,short,byte | |
浮点类型 | double,float,half_float,scaled_float | |
逻辑类型 | boolean | |
日期类型 | date | |
范围类型 | range | |
二进制类型 | binary | |
复合类型 | 数组类型 | array |
对象类型 | object | |
嵌套类型 | nested | |
地理类型 | 地理坐标类型 | geo_point |
地理地图 | geo_shape | |
特殊类型 | IP类型 | ip |
范围类型 | completion | |
令牌计数类型 | token_count | |
附件类型 | attachment | |
抽取类型 | percolator |
创建一个索引(IK需要提前配置好),然后通过golang组件,go-mysql-elasticsearch进行数据同步到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"
}
}
}
}
查看索引数据
GET /_cat/indices?v
可以看到当前products索引下没有数据
2 elasticsearch与mysql数据同步
2.1 go-mysql-elasticsearch简介
go-mysql-elasticsearch是一款开源的高性能的Mysql数据同步ES的工具,其由go语言开发,编译及使用非常简单。go-mysql-elasticsearch的原理很简单,首先使用mysqldump获取当前MySQL的数据,然后在通过此时binlog的name和position获取增量数据,再根据binlog构建restful api写入数据到ES中。
注意:
1.mysql binlog必须是ROW模式。
2.要同步的mysql数据表必须包含主键,否则直接忽略,这是因为如果数据表没有主键,UPDATE和DELETE操作就会因为在ES中找不到对应的document而无法进行同步。
3.不支持程序运行过程中修改表结构。
2.2 安装go-mysql-elasticsearch
1.拉取go-mysql-elasticsearch镜像
docker pull gozer/go-mysql-elasticsearch
2.创建一个目录用于存储配置文件
mkdir /docker/go-mysql-es
cd /docker/go-mysql-es
touch go_mysql_river.toml
配置文件内容如下
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" --数据存储目录
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 --批量数据
flush_bulk_time = "200ms"
skip_no_pk_table = false
[[source]]
schema = "lmrs" --同步的数据库
tables = ["lmrs_products"] --同步的表(可指定多个["lmrs_products","table2"],当前指定一个)
[[rule]] --过滤字段
schema = "lmrs_2008_shops" --同步的数据库
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.构建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索引的数据
GET /_cat/indices?v
手动在数据库中新增一条记录,继续查看索引数据
再删除两条数据,继续查看索引数据