环境依赖:
操作系统:Mac
go:go1.11
ElasticSearch:5.6.9
Java:1.8
elasticdump
elasticsearch-analysis-ik 6.3.2
通过brew install [email protected]
安装
配置elasticsearch环境变量
admindeMBP:lab admin$ echo 'export PATH="/usr/local/opt/[email protected]/bin:$PATH"' >> ~/.bash_profile
admindeMBP:lab admin$ ls /usr/local/opt/[email protected]/bin
elasticsearch elasticsearch-keystore elasticsearch-plugin elasticsearch-translog
配置好path变量,进行查看
zhiliaodeMBP:~ zhiliao$ which elasticsearch
/usr/local/opt/[email protected]/bin/elasticsearch
zhiliaodeMBP:~ zhiliao$
由于elasticsearch是利用Java进行开发的,所以我们还需要安装Java环境
官网:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
版本:jdk1.8
参考https://github.com/medcl/elasticsearch-analysis-ik
首先通过which elasticsearch-plugin查看是否安装plugin
zhiliaodeMBP:~ zhiliao$ which elasticsearch-plugin
/usr/local/opt/[email protected]/bin/elasticsearch-plugin
我本机已经安装,然后就去安装elasticsearch-analysis-ik分词器
目前官方最新版本是v6.3.2
然后就下载即可,通过如下命令
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.6.9/elasticsearch-analysis-ik-5.6.9.zip
通过npm install -g elasticdump
进行安装
然后通过如下命令查看是否安装,我本机已经安装
zhiliaodeMBP:~ zhiliao$ which elasticdump
/usr/local/bin/elasticdump
直接通过elasticsearch
来启动即可
zhiliaodeMBP:bin zhiliao$ elasticsearch
[2018-09-25T17:01:19,524][INFO ][o.e.n.Node ] [] initializing ...
[2018-09-25T17:01:19,611][INFO ][o.e.e.NodeEnvironment ] [hOWqTfH] using [1] data paths, mounts [[/ (/dev/disk1s1)]], net usable_space [181.9gb], net total_space [233.5gb], spins? [unknown], types [apfs]
[2018-09-25T17:01:19,612][INFO ][o.e.e.NodeEnvironment ] [hOWqTfH] heap size [1.9gb], compressed ordinary object pointers [true]
如果一切正常,Elastic 就会在默认的9200端口运行。这时,打开另一个命令行窗口,请求该端口,会得到说明信息
zhiliaodeMBP:Desktop zhiliao$ curl localhost:9200
{
"name" : "hOWqTfH",
"cluster_name" : "elasticsearch_zhiliao",
"cluster_uuid" : "hWBc33irTL-wCsEbnLTjgw",
"version" : {
"number" : "5.6.9",
"build_hash" : "877a590",
"build_date" : "2018-04-12T16:25:14.838Z",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}
zhiliaodeMBP:Desktop zhiliao$
上面代码中,请求9200端口,Elastic 返回一个 JSON 对象,包含当前节点、集群、版本等信息
Cluster
Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。
单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。
Index
Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。
下面的命令可以查看当前节点的所有 Index。
zhiliaodeMBP:Desktop zhiliao$ curl -X GET 'http://localhost:9200/_cat/indices?v'
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open index_safly -l4j2UPpTgu64jsk7jzUvA 5 1 1 0 4.4kb 4.4kb
yellow open index_1 np0ouRCDRC-eXDrilpSFjQ 5 1 3 0 11.8kb 11.8kb
yellow open index_temp qS7IWYm-ROOFBjnNgVCE4w 5 1 1 0 5.4kb 5.4kb
yellow open qrelations pemnB8e-SumcYVNQRyYNAA 5 1 88736 6301 14.3mb 14.3mb
yellow open qa v6avnFsfSResWMs0LcAXdQ 5 1 8 0 66.7kb 66.7kb
yellow open weather qFUsE8OiSmKzaXmj8TjIOA 5 1 0 0 955b 955b
yellow open question E6iJvA5RTpq1LnJQr748dQ 5 1 66974 8169 41.9mb 41.9mb
yellow open index_2 pgyxlcW9QHORddZeLNGeDg 5 1 2 0 8.2kb 8.2kb
yellow open my-index wNnhnRtNTkaVziWKU_7_mA 5 1 0 0 955b 955b
zhiliaodeMBP:Desktop zhiliao$
Document
Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。
同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。
Type
Document 可以分组,比如weather这个 Index 里面,可以按城市分组(北京和上海),也可以按气候分组(晴天和雨天)。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document。
不同的 Type 应该有相似的结构(schema),举例来说,id字段不能在这个组是字符串,在另一个组是数值。这是与关系型数据库的表的一个区别。性质完全不同的数据(比如products和logs)应该存成两个 Index,而不是一个 Index 里面的两个 Type(虽然可以做到)。
这里我只列出了某一个index的数据
以如下的index_1 为例
es.index(index="index_1", doc_type="index_1", id=1, body={"any": "index_1_1_data", "age": 30})
es.index(index="index_1", doc_type="index_2", id=2, body={"any": "index_1_2_data", "age": 40})
下面的命令可以列出每个 Index 所包含的 Type。
curl 'localhost:9200/_mapping?pretty=true'
{
"index_1":{
"mappings":{
"index_2":{
"properties":{
"age":{
"type":"long"
},
"any":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
}
}
},
"index_1":{
"properties":{
"age":{
"type":"long"
},
"any":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
}
}
}
}
}
}
gopkg.in/olivere/elastic.v5参考资料
To get the package, execute:
go get gopkg.in/olivere/elastic.v5
To import this package, add the following line to your code:
import "gopkg.in/olivere/elastic.v5"
package main
import (
"fmt"
"gopkg.in/olivere/elastic.v5"
"log"
"os"
"time"
)
var host = "http://127.0.0.1:9200/"
func init() {
client, err := elastic.NewClient(
elastic.SetURL(host),
elastic.SetSniff(false),
elastic.SetHealthcheckInterval(10*time.Second),
elastic.SetGzip(true),
elastic.SetErrorLog(log.New(os.Stderr, "ELASTIC ", log.LstdFlags)),
elastic.SetInfoLog(log.New(os.Stdout, "", log.LstdFlags)))
if err!= nil{
panic(err)
}
fmt.Println("conn es succ",client)
}
func main() {
}
输出结果如下:
conn es succ http://127.0.0.1:9200 [dead=false,failures=0,deadSince=]
Elastic comes with the following configuration settings:
以下配置信息说明是摘自
https://github.com/olivere/elastic/wiki/Configuration
1、SetHttpClient(*http.Client)允许您配置自己的http.Client和/或http.Transport(默认为http.DefaultClient);在许多弹性实例中使用相同的http.Client(即使使用http.DefaultClient)是一个好主意,以便有效地使用打开的TCP连接。
2、StURURL(…字符串)允许您指定要连接的URL(默认值是http://127.0.0.1:9200)。
3、StasBaseCuthe(用户名,密码字符串)允许您指定HTTP基本身份验证详细信息。使用这个,例如用盾牌。
4、SETSNIFF(BOOL)允许您指定弹性是否应该定期检查集群(默认为真)。
5、StSnIFFEffTimeOUT(时间。持续时间)是嗅探节点弹出时间之前的时间(默认为2秒)。
6、StnSnFiffer-TimeOutExpLoT(时间。持续时间)是创建新客户端时使用的嗅探超时。它通常比嗅探器超时大,并且证明对慢启动有帮助(默认为5秒)。
7、StnSnIFFER间隔(时间。持续时间)允许您指定两个嗅探器进程之间的间隔(默认为15分钟)。
8、SetHealthcheck(bool)允许您通过尝试定期连接到它的节点(默认为true)来指定Elastic是否将执行健康检查。
9、SethalthCuffTimeExt(时间。持续时间)是健康检查的超时时间(默认值为1秒)。
10、SethalthCuffTimeOutExtudio(时间。持续时间)是创建新客户端时使用的健康检查超时。它通常大于健康检查超时,并可能有助于慢启动(默认为5秒)。
11、sethealthcheckinterval(time.duration)指定间隔之间的两个健康检查(默认是60秒)。
12、
SetDecoder(.ic.Decoder)允许您为来自Elasticsearch的JSON消息设置自己的解码器(默认为&.ic.DefaultDecoder{})。
13、StError日志(*Log.LoggER)将日志记录器设置为用于错误消息(默认为NIL)。错误日志将包含例如关于加入群集的节点或标记为“死亡”的消息。
14、
SETIN FLUOG(*Log.LoggER)将记录器设置为用于信息性消息(默认为NIL)。信息日志将包含例如请求和它们的响应时间。
15、
StReTraceLoG(*Log.LoggER)设置用于打印HTTP请求和响应(默认为NIL)的记录器。这有助于调试有线上正在发生的事情
16、
StestRealdPuelin(插件…字符串)设置需要注册的插件列表。弹性将设法在启动时找到它们。如果没有找到其中一个,则在启动时会发现一个类型的弹性错误。
17、
StReReTrice(…)设置用于处理失败请求的重试策略。详情请参阅重试和退避
18、
SETGZIP(BOOL)启用或禁用请求端的压缩。默认情况下禁用。
首先列出当前的index
zhiliaodeMBP:Desktop zhiliao$ curl -X GET 'http://localhost:9200/_cat/indices?v'
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open index_safly -l4j2UPpTgu64jsk7jzUvA 5 1 1 0 4.4kb 4.4kb
yellow open index_1 np0ouRCDRC-eXDrilpSFjQ 5 1 3 0 11.8kb 11.8kb
yellow open index_temp qS7IWYm-ROOFBjnNgVCE4w 5 1 1 0 5.4kb 5.4kb
yellow open qrelations pemnB8e-SumcYVNQRyYNAA 5 1 88736 6301 14.3mb 14.3mb
yellow open qa v6avnFsfSResWMs0LcAXdQ 5 1 8 0 66.7kb 66.7kb
yellow open weather qFUsE8OiSmKzaXmj8TjIOA 5 1 0 0 955b 955b
yellow open question E6iJvA5RTpq1LnJQr748dQ 5 1 66974 8169 41.9mb 41.9mb
yellow open index_2 pgyxlcW9QHORddZeLNGeDg 5 1 2 0 8.2kb 8.2kb
yellow open my-index wNnhnRtNTkaVziWKU_7_mA 5 1 0 0 955b 955b
yellow open weather1 -l8fiEyNRD2gt1JpdlR2Ug 5 1 0 0 810b 810b
zhiliaodeMBP:Desktop zhiliao$
package main
import (
"context"
"fmt"
"gopkg.in/olivere/elastic.v5"
"log"
"os"
"time"
)
var host = "http://127.0.0.1:9200/"
func connect() *elastic.Client {
client, err := elastic.NewClient(
elastic.SetURL(host),
elastic.SetSniff(false),
elastic.SetHealthcheckInterval(10*time.Second),
elastic.SetGzip(true),
elastic.SetErrorLog(log.New(os.Stderr, "ELASTIC ", log.LstdFlags)),
elastic.SetInfoLog(log.New(os.Stdout, "", log.LstdFlags)))
if err != nil {
panic(err)
}
return client
}
func main() {
client := connect()
fmt.Println("client", client)
mapping := `{
"settings":{
"number_of_shards":1,
"number_of_replicas":0
},
"mappings":{
"tweet":{
"properties":{
"tags":{
"type":"string"
},
"location":{
"type":"geo_point"
}
}
}
}
}`
ctx := context.Background()
createIndex, err := client.CreateIndex("twitter").BodyString(mapping).Do(ctx)
if err != nil {
panic(err)
}
if !createIndex.Acknowledged {
fmt.Println("!createIndex.Acknowledged")
} else {
fmt.Println("createIndex.Acknowledged")
}
}
输出结果如下:
client http://127.0.0.1:9200 [dead=false,failures=0,deadSince=]
2018/09/25 20:10:02 PUT http://127.0.0.1:9200/twitter [status:200, request:0.043s]
createIndex.Acknowledged
我们在次看下所有的索引,发现增加了一条twitter
的索引记录
zhiliaodeMBP:Desktop zhiliao$ curl -X GET 'http://localhost:9200/_cat/indices?v'
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open index_safly -l4j2UPpTgu64jsk7jzUvA 5 1 1 0 4.4kb 4.4kb
green open twitter MkwF6w7jQzu8fEFsEG85fA 1 0 0 0 162b 162b
yellow open index_1 np0ouRCDRC-eXDrilpSFjQ 5 1 3 0 11.8kb 11.8kb
yellow open index_temp qS7IWYm-ROOFBjnNgVCE4w 5 1 1 0 5.4kb 5.4kb
yellow open qrelations pemnB8e-SumcYVNQRyYNAA 5 1 88736 6301 14.3mb 14.3mb
yellow open qa v6avnFsfSResWMs0LcAXdQ 5 1 8 0 66.7kb 66.7kb
yellow open weather qFUsE8OiSmKzaXmj8TjIOA 5 1 0 0 955b 955b
yellow open question E6iJvA5RTpq1LnJQr748dQ 5 1 66974 8169 41.9mb 41.9mb
yellow open index_2 pgyxlcW9QHORddZeLNGeDg 5 1 2 0 8.2kb 8.2kb
yellow open my-index wNnhnRtNTkaVziWKU_7_mA 5 1 0 0 955b 955b
yellow open weather1 -l8fiEyNRD2gt1JpdlR2Ug 5 1 0 0 810b 810b
zhiliaodeMBP:Desktop zhiliao$
注意当我们再次运行该代码时,就会报如下的错误,因为索引已经存在
client http://127.0.0.1:9200 [dead=false,failures=0,deadSince=]
panic: elastic: Error 400 (Bad Request): index [twitter/MkwF6w7jQzu8fEFsEG85fA] already exists [type=index_already_exists_exception]
goroutine 1 [running]:
main.main()
/Users/zhiliao/zhiliao/go/src/goweb/quick/quick.go:60 +0x1f7
接下来我们通过下面的代码,将刚创建的索引Twitter删掉
func main() {
client := connect()
fmt.Println("client", client)
ctx := context.Background()
deleIndex,err:=client.DeleteIndex("twitter").Do(ctx)
if err != nil{
panic(err)
}
if !deleIndex.Acknowledged {
fmt.Println("!deleIndex.Acknowledged")
} else {
fmt.Println("deleIndex.Acknowledged")
}
}
控制台输出如下:
client http://127.0.0.1:9200 [dead=false,failures=0,deadSince=]
2018/09/25 20:25:32 DELETE http://127.0.0.1:9200/twitter [status:200, request:0.030s]
deleIndex.Acknowledged
当我们在次执行该删除操作时候, 会报错,因为索引不存在
client http://127.0.0.1:9200 [dead=false,failures=0,deadSince=]
panic: elastic: Error 404 (Not Found): no such index [type=index_not_found_exception]
goroutine 1 [running]:
main.main()
/Users/zhiliao/zhiliao/go/src/goweb/quick/quick.go:39 +0x297
Process finished with exit code 2
所以我们应该提前判断下是否存在!!!
func main() {
client := connect()
fmt.Println("client", client)
ctx := context.Background()
exist,err:=client.IndexExists("twitter").Do(ctx)
if err!= nil{
//handle error
}
if !exist{
//不存在创建
}else{
//存在删除
deleIndex,err:=client.DeleteIndex("twitter").Do(ctx)
if err != nil{
panic(err)
}
if !deleIndex.Acknowledged {
fmt.Println("!deleIndex.Acknowledged")
} else {
fmt.Println("deleIndex.Acknowledged")
}
}
}