golang基础--gopkg.in/olivere/elastic.v5学习一(环境配置、链接、增加删除索引)

文章目录

      • 环境配置
        • 安装elasticsearch
        • 安装Java SDK
        • 安装分词器
        • 安装elasticdump数据迁移
        • 启动
        • 测试运行
      • 名词概念、查看index、查看type
      • 使用gopkg.in/olivere/elastic.v5链接
      • 增加、删除索引
        • 增加索引
        • 删除索引

环境配置

环境依赖:
操作系统:Mac
  go:go1.11
  ElasticSearch:5.6.9 
  Java:1.8
  elasticdump
  elasticsearch-analysis-ik 6.3.2

安装elasticsearch

通过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$ 

安装Java SDK

由于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

安装elasticdump数据迁移

通过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 对象,包含当前节点、集群、版本等信息

名词概念、查看index、查看type

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链接

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")

		}
	}
}

你可能感兴趣的:(Go基础)