Go & ES7.4 速学:快速部署、Go SDK、 Mapping
快速部署
这里为了方便直接使用 Docker,官方镜像是 CentOS 镜像,不够美丽,因此我们使用了第三方的镜像,体积比较小,适合我们在学习过程中快速部署。
docker pull blacktop/elasticsearch:7.4
下载好后修改 tag,不然太长了
docker tag blacktop/elasticsearch:7.4 es:74
运行 ES。
docker run -d --name es -p 9200:9200 es:74
如果我们是在虚拟机中使用 docker 那么内存尽量要大了一点,至少
有 4G 的内存。
执行 curl 看一下容器是否启动成功:
$ curl [http://192.168.124.16:9200/](http://192.168.124.16:9200/)
{
"name" : "832e35c81ff4",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "tfwkn9ZKQNO0PD0iNfqdwg",
"version" : {
"number" : "7.4.2",
"build_flavor" : "oss",
"build_type" : "tar",
"build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96",
"build_date" : "2019-10-28T20:40:44.881551Z",
"build_snapshot" : false,
"lucene_version" : "8.2.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
GolangSDK
Go 的 SDK我们也选择第三方的库,因为目前官方的库还没有第三方实用。
go get github.com/olivere/elastic/v7
mapping
mapping 映射类似于在数据库中定义表结构,表里里有哪些字段、字段是什么类型。没有mapping 也能够创建索引,但是正规的方式是自己来创建 mapping,而不是动态映射。
例如现在一个 MySQL 中有一个news 表,其中存储的是新闻,表结构如下:
字段 name | 备注 |
---|---|
news_id | 新闻 id |
news_title | 新闻标题 |
news_type | 新闻类型(目前为中文) |
news_status | 0 代表下架 1 正常 2 不可修改 |
在向 es 中导入的时候,我们可以不创建这个表结构,直接向 es中写入数据,es 可以进行类型推断,但是有的时候会推测错误,一般来说我们得先创建表结构。
同时向 es 写入数据有两种模式:
- 直接调用 es 的 api
- 通过 logstat 导入数据
一般我们不会选择第一种,而是直接选择使用 logstat 导入。
在 es 中字段一旦增加就不能删除了,只能新增,所以在最开始我们尽量就设计好,要不更改的时候会比较麻烦。
我们现在来创建 mapping,es 为我们提供了接口,我们使用 curl 发送请求创建接口
$ curl --location --request PUT 'http://192.168.124.16:9200/news' \
> --header 'Content-Type: application/json' \
> --data-raw '{
> "mappings" : {
> "properties" : {
> "news_title": {
> "type": "text"
> },
> "news_type": {
> "type" : "keyword"
> },
> "news_status": {
> "type": "byte"
> }
> }
> }
> }'
{"acknowledged":true,"shards_acknowledged":true,"index":"news"}
/news
是我们的索引名称,—data-raw
中就是我们要创建的数据。
创建完成后我们通过 get 方式可以查看 mapping。
curl --location --request GET 'http://192.168.124.16:9200/news/_mapping'
{"news":{"mappings":{"properties":{"news_status":{"type":"byte"},"news_title":{"type":"text"},"news_type":{"type":"keyword"}}}}}%
Go 查看 Mapping
接下来,我们用 golang 实现获取 mapping,代码其实非常简单:
package main
import (
"context"
"fmt"
"github.com/olivere/elastic/v7"
"log"
)
func main() {
client, err := elastic.NewClient(
elastic.SetURL("http://192.168.124.16:9200/"),
elastic.SetSniff(false),
)
if err != nil {
log.Fatal(err)
}
ctx := context.Background()
mapping, err := client.GetMapping().Index("news").Do(ctx)
if err != nil {
log.Fatal(err)
}
fmt.Println(mapping)
}
# 代码运行结果
# map[news:map[mappings:map[properties:map[news_status:map[type:byte] news_title:map[type:text] news_type:map[type:keyword]]]]]
这里需要注意的是 elastic.SetSniff(false)
,当我们使用 elastic
的时候会自动转换地址,不过获取的地址由于我们使用的是 docker,这就导致获取IP 地址的时候其实得到的是容器的内容地址,我们是否无法访问的。