elasticsearch
laradock-elasticsearch启动失败
sudo sysctl -w vm.max_map_count=524288
laradock安装ik分词器
1、进入 laradock/elasticsearch
修改 Dockerfile
ARG ELK_VERSION
FROM elasticsearch:${ELK_VERSION}
# 添加下面一行安装命令
RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.1/elasticsearch-analysis-ik-7.9.1.zip
EXPOSE 9200 9300
注意:ik分词器的版本要和elasticsearch的版本是一致的,不然会报错.
可以先通过 docker images | grep elassticsearch
查看一下search的版本
考虑到在我天朝下载github的东西会比较慢,可以先下载ik再copy进去
mkdir -p pathto/laradock/elasticsearch/plugins
|-- Dockerfile
`-- plugins
`-- elasticsearch-analysis-ik-7.9.1.zip
修改 elasticsearch/Dockerfile
COPY ./plugins/elasticsearch-analysis-ik-7.9.1.zip /usr/share/elasticsearch/plugins
2、重新 build
docker-compose build elasticsearch
3、最后,查看是否安装成功:
docker-compose exec elasticsearch /usr/share/elasticsearch/bin/elasticsearch-plugin list
ik分词器Github:https://github.com/medcl/elasticsearch-analysis-ik/tree/v7.9.1
跨域
修改 elasticsearch/Dockerfile
RUN cat <<<
http.cors.enabled: true
http.cors.allow-origin: "*"
>>> >> /usr/share/elasticsearch/config/elasticsearch.yml
分布式部署
server1
http.port: 8300
cluster.name: search //标识集群
node.name: master
node.master: true
node1
http.port: 8301
cluster.name: search //标识集群
node.name: node1
node.master: false
discovery.zen.ping.unicast.hosts: ["127.0.0.1"] // 自动发现主节点
字段映射
- text:用于全文搜索,可以进行分词(tokenization)和分析(analysis)。适用于需要全文搜索的字段,如文章内容、产品描述等。
- keyword:用于结构化搜索,不进行分词,每个值作为一个独立的词元(term)。适用于精确匹配的字段,如标签、状态、分类等。
- date:用于存储日期和时间。ElasticSearch可以对日期字段进行范围查询和排序。
- integer、long、short、byte:用于存储整数值。适用于年龄、评分、数量等数值型字段。
- float、double、half_float:用于存储浮点数值。适用于价格、温度、经纬度等需要小数的字段。
- boolean:用于存储布尔值(true/false)。
- binary:用于存储二进制数据,如文件或图片。
- nested:用于存储嵌套对象,允许在嵌套的文档中进行复杂查询。
- object:用于存储JSON对象,可以包含多个字段和子字段。
- ip:用于存储IP地址。
- completion:用于自动完成功能,可以提供搜索建议。
- murmur3:用于哈希字段,可以用于散列数据以减少内存使用。
- token_count:用于统计词元数量,通常用于统计文本中的词频。
- scaled_float:用于存储浮点数值,但可以指定一个缩放因子,以减少精度要求,节省存储空间。
- date_nanos:类似于date类型,但支持更高精度的时间戳。
- rank_feature:用于排名特征,可以用于排序和打分。
- search_as_you_type:用于实现搜索时的自动完成和纠错功能,适用于需要快速响应和模糊匹配的场景。
查询
GET /movie/_mapping
"mappings" : map[string]interface{}{
"properties": map[string]interface{}{
//"title": map[string]interface{}{
// "type": "text",
//},
//"director": map[string]interface{}{
// "type": "keyword",
//},
//"actor": map[string]interface{}{
// "type": "keyword",
//},
//"year": map[string]interface{}{
//
//},
},
创建
PUT /movie
{
"mappings": {
"properties": {
"id": {
"type": "integer"
},
"vod_name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"type_name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"created_at": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||strict_date_optional_time"
},
"updated_at": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||strict_date_optional_time"
}
}
}
}
更新
PUT /movie/_mapping
{
"properties": {
"id": {
"type": "long"
},
"created_at": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||strict_date_optional_time"
},
"updated_at": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||strict_date_optional_time"
}
}
}
删除
批量操作
# 批量添加
POST /_bulk
{"index": {"_index": "demo","_id": "1"}}
{"name": "orangbus","age": 22}
{"index": {"_index": "demo","_id": "2"}}
{"name": "orangbus","age": 23}
GET /demo/_search
# 添加
POST /demo/_bulk
{"create": {"_index": "demo","_id": 3}}
{"name": "orangbus","age": 24}
# 更新
POST /demo/_bulk
{"update": {"_index": "demo","_id": 3}}
{"doc": {"name": "orangbus"}}
# 删除
POST /demo/_bulk
{"delete": {"_index": "demo","_id": 3}}
字段类型
keyword
类型的字段不会被分词
match
会使用分词器
查询
多个条件使用空格分开
GET arc/_search
{
"query": {
"match":{
"name" : "张三 李四"
}
}
}
精确匹配
GET arc/_search
{
"query": {
"term": {
"status": 1
},
"match":{
"name" : "张三"
}
}
}
wherein查询
GET /movie/_search
{
"size": 100,
"query": {
"bool": {
"must": [
{
"match": {
"vod_name": "美女 帅哥"
}
},
{
"terms": {
"api_id": [17,18,19]
}
}
]
}
},
"_source":[
"api_id",
"vod_name"
]
}
bettewn 查询
GET /movies/_search
{
"from": 0,
"size": 30,
"query": {
"bool": {
"filter": [
{
"range": {
"api_id": {
"gte": 0, // 大于等于
"lte": 20 // 小于等于
}
}
}
]
}
}
}
时间范围查询
GET /movie/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"vod_name": "约炮 美女 探花 少妇 国产 女同"
}
}
],
"filter": [
{
"range": {
// 方式1
# "created_at": {
# "gte": "now-3d/d", // 过去14天
# "lte": "now/d", // 当前时间
# "format": "yyyy-MM-dd",
# "time_zone": "Asia/Shanghai"
# },
// 方式2
"created_at": {
"gte": "2024-06-14",
"lte": "2024-06-14",
"format": "yyyy-MM-dd",
"time_zone": "Asia/Shanghai"
}
}
}
]
}
}
}
字段限制
"_source": ["name","age"]
GET arc/_search
{
"query": {
"match": {
"name": "王三"
}
},
"_source": ["name","age"]
}
排序
"sort": [ { "age": { "order": "desc" } } ]
GET arc/_search
{
"query": {
"match": {
"name": "王三"
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
分页查询
form: 起始值
size: limit
GET arc/_search
{
"query": {
"match": {
"name": "王三"
}
},
"from": 0,
"size": 2
}
高亮查询
{
"query": {
"match": {
"vod_name": "orangbus"
}
},
"from": 0,
"size": 10,
"highlight": {
"boundary_scanner_locale": "zh_CN",
"pre_tags": ["<span style='color:red'>"],
"post_tags": ["</span>"],
"fields": {
"vod_title":{
// "pre_tags": [ "<em>"],
// "post_tags": [ "</em>" ]
},
"category":{
// "pre_tags": [ "<em>"],
// "post_tags": [ "</em>" ]
}
}
}
}
推荐查询
GET /movie/_search
{
"query": {
"more_like_this": {
"fields": [
"name"
],
"like": ["中国","美女","风景"],
"min_term_freq": 1,
"max_query_terms": 12
}
}
}
统计
统计电影分类的电影数
GET /movie/_search
{
"size": 0,
"aggs": {
"movie_count": { // 自定义分组名称
"terms": { // cate_id相等
"field": "cate_id"
}
}
}
}
{
"took": 53,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 10000,
"relation": "gte"
},
"max_score": null,
"hits": []
},
"aggregations": {
"api_count": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 18,
"doc_count": 21475
},
{
"key": 60,
"doc_count": 14808
},
{
"key": 24,
"doc_count": 6714
},
{
"key": 2,
"doc_count": 1561
}
]
}
}
}
mysql同步数据到es中
环境准备
你应该事先准备好一个MySQL环境,并按以下步骤进行设置。
开启binlog
需要先开启MySQL的 binlog 写入功能,配置 binlog-format
为 ROW
模式,具体my.cnf
中配置如下:
[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
修改配置文件之后,重启MySQL。
使用命令查看是否打开binlog模式,如输出以下内容则说明binlog已开启。
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
查看binlog_format
配置是否正确。
mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
添加授权
Canal的原理是模拟自己为MySQL slave,所以一定要为账号授予做为MySQL slave的相关权限。
下面的命令是先创建一个名为canal
的账号,再对其进行授权,如果已有账户可直接 grant。
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
安装canal
docker pull canal/canal-server:latest
启动容器
docker run -d --name canal-server -p 11111:11111 canal/canal-server
进入容器。
docker exec -it canal-server /bin/bash
修改配置。
vim canal-server/conf/example/instance.properties
示例
#################################################
## mysql serverId , v1.0.26+ will autoGen
# canal.instance.mysql.slaveId=0
# enable gtid use true/false
canal.instance.gtidon=false
# position info
canal.instance.master.address=127.0.0.1:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=
# rds oss binlog
canal.instance.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=
# table meta tsdb info
canal.instance.tsdb.enable=true
#canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
canal.instance.tsdb.dbUsername=canal
canal.instance.tsdb.dbPassword=canal
修改完配置后重启容器。
docker container restart canal-server