Go Elasticsearch index CRUD

这篇具有很好参考价值的文章主要介绍了Go Elasticsearch index CRUD。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.简介

Elasticsearch 的索引(index)是文档(document)的集合,类似 MySQL 的表。文档是 ES 中存储的一条 JSON 格式的数据。

index 是一个逻辑空间的概念,index 中的文档会分散放在不同的 shard 中,而 shard 在 ES 中则是个物理空间的概念。

index 由以下几个部份组成:

  • data:由 document + metadata 所組成;
  • mapping:用来定义文档结构,如字段名称 & 类型;
  • setting:定义数据是如何存放,如 shard 和 replica 数量。

下面设计一个 index 用来描述我们要存储的用户信息,index 也用一个 JSON 串来表示。

index = `{
	"mappings":{
		"dynamic": "strict",
		"properties":{
			"id": 				{ "type": "long" },
			"username": 		{ "type": "keyword" },
			"nickname":			{ "type": "text" },
			"phone":			{ "type": "keyword" },
			"age":				{ "type": "long" },
			"ancestral":		{ "type": "text" },
			"identity":         { "type": "text" },
			"update_time":		{ "type": "long" },
			"create_time":		{ "type": "long" }
		}
	},
	"settings" : {
      "index" : {
        "number_of_shards" : "1",
        "number_of_replicas" : "1"
      }
    }
}`

其中 dynamic 是 mapping 一个很重要的属性 ,来控制是否动态添加新字段,并接受以下参数:

参数 说明
true New fields are added to the mapping (default).
runtime New fields are added to the mapping as runtime fields. These fields are not indexed, and are loaded from _source at query time.
false New fields are ignored. These fields will not be indexed or searchable, but will still appear in the _source field of returned hits. These fields will not be added to the mapping, and new fields must be added explicitly.
strict If new fields are detected, an exception is thrown and the document is rejected. New fields must be explicitly added to the mapping.
  • dynamic 为 true 表示动态映射(dynamic mapping)。

true 为缺省值。添加的文档中如果有新增的字段,则 ES 会自动把新的字段添加到映射中。新增的字段可以被索引,也就是这个字段可以被搜索,mapping 同时也被更新。

  • dynamic 为 false 表示静态(显式)映射(explicit mapping)。

当 ES 察觉到有新增字段时,会写入新字段,但不会索引新字段,即无法通过新字段进行查询。在有些情况下,静态映射依然不够,所以还需要更严谨的策略来进一步做限制。

  • dynamic 为 strict 表示精确(严格)映射(strict mapping)。

字段需要严格匹配,新增字段写入将会报错。

一般静态映射用的较多。就像 HTML 的 img 标签一样,src 为自带的属性,你可以在需要的时候添加 id 或者 class 属性。当然,如果你非常了解你的数据,并且未来很长一段时间不会改变,strict 不失为一个好选择。

注意: 动态映射很方便,但是实际业务中,对于关键字段类型,通常预先定义好,这样可以避免 ES 自动生成不是你想要的字段类型。

2.增加

设计好了 index 及 mapping 后,我们开始编写代码进行创建。

// ESIndexExists 索引是否存在。
func ESIndexExists(ctx context.Context, index string) (bool, error) {
	return GetESClient().IndexExists(index).Do(ctx)
}

// CrtESIndex 创建 ES 索引。
func CrtESIndex(ctx context.Context, index, desc string) error {
	exist, err := ESIndexExists(ctx, index)
	if err != nil {
		return err
	}
	// 已经创建
	if exist {
		return nil
	}
	// 重复创建会报错
	_, err = GetESClient().CreateIndex(index).BodyString(desc).Do(ctx)
	return err
}

因为重复创建 index,ES 会报错,所以创建前先判断一下是否已经创建。

创建成功后,我们在 Kibana 上通过 Restful API 可以查看到刚刚创建的 index。

GET /es_index_userinfo

{
  "es_index_userinfo" : {
    "aliases" : { },
    "mappings" : {
      "dynamic" : "strict",
      "properties" : {
        "age" : {
          "type" : "long"
        },
        "ancestral" : {
          "type" : "text"
        },
        "create_time" : {
          "type" : "long"
        },
        "id" : {
          "type" : "long"
        },
        "nickname" : {
          "type" : "text"
        },
        "phone" : {
          "type" : "keyword"
        },
        "update_time" : {
          "type" : "long"
        },
        "username" : {
          "type" : "keyword"
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1627546052453",
        "number_of_shards" : "1",
        "number_of_replicas" : "1",
        "uuid" : "_FIlQz-uQD2ynzITVPFpRw",
        "version" : {
          "created" : "7070099"
        },
        "provided_name" : "es_index_userinfo"
      }
    }
  }
}

其中 number_of_shards 为主分片数,缺省为 1,只能在创建索引时指定,后期无法修改。number_of_replicas 是指每个分片有多少个副本,后期可以动态修改。

对应的 RESTful API 为:

PUT /es_index_userinfo
{
  "mappings":{
		"dynamic": "strict",
		"properties":{
			"id": 				{ "type": "long" },
			"username": 		{ "type": "keyword" },
			"nickname":			{ "type": "text" },
			"phone":			{ "type": "keyword" },
			"age":				{ "type": "long" },
			"ancestral":		{ "type": "text" },
			"update_time":		{ "type": "long" },
			"create_time":		{ "type": "long" }
		}
	}
}

2.删除

通过 RESTful API 删除 index 很简单,格式如下:

DELETE /<index>

比如删除上面创建的 es_index_userinfo。

DELETE /es_index_userinfo

3.修改

对于一个已经存在的 index,我们可以修改 index 的相关设置。

3.1 更新 mapping

3.1.1 增加字段

比如修改文档结构,即修改 index 的 mapping,我们想其中再增加一个字段爱好 hobby。

PUT /es_index_userinfo/_mapping
{
  "properties": {
    "hobby": {
      "type":"text"
    }
  }
}

3.1.2 删除字段

ES 中已经添加成功的字段是没法直接删除的,因为这会导致数据不可用。我们可以通过间接的方式来完成字段的删除。操作步骤如下:
(1)创建一个新的 index,不包含要删除的字段;
(2)删除原 index 中待删除字段的数据。只删除数据,不删除字段。因为如果不清空字段值的话,在下面的 reindex 会出现问题,如果新 index 的 mapping 的 dynamic 属性为 strict,会出错。

POST es_index_userinfo/_update_by_query
{
    "script" : "ctx._source.remove('hobby')",
    "query": {
        "match_all": {}
    }
}

(3)通过 redindex 将数据拷贝至新的 index;

POST /_reindex
{
  "source": {
    "index": "my-index"
  },
  "dest": {
    "index": "my-new-index"
  }
}

(4)删除旧的 index;
(5)给新 index 添加别名,别名是旧 index。

POST <target>/_alias/<alias>

注意:完成第四步后,才能进行第五步的操作,期间会导致依赖该 index 的服务短暂不可用,所以尽量在业务低峰时间段操作。最安全的做法,是完成上面前三部操作后,将服务通过配置的方式把使用的 index 切换到新的 index。再进行后面的两步操作。

3.1.3 添加 multi-fields

一个字段可以存在多个类型,通过添加 multi-fields 来实现。

比如一个字段既要支持分词匹配,又要支持全词匹配,那么需要为其添加两个类型,分别是 text 和 keyword。

PUT /<index>/_mapping
{
  "properties": {
    "city": {
      "type": "text",
      "fields": {
        "raw": {
          "type": "keyword"
        }
      }
    }
  }
}

引用 keyword 的类型字段方式为city.raw

这里需要注意的是,新增的字段 raw 只对新加入的 document 生效,旧的数据无法通过新字段 raw 来检索。如果想要对旧数据生效,一般有两个做法:
(1)更新旧字段。读取旧字段的值重新覆盖一次。

POST /<index>/_update_by_query?refresh=true
{
  "query": {
    "match_all":{}
  },
  "script": {
    "source": "ctx._source['city'] = ctx._source.city"
  }
}

(2)reindex。新建一个 index,将旧 index 数据拷贝到新的 index,再删除旧 index,再给新 index 添加一个别名为旧 index。

3.2 重命名 index

ES 中不能直接重命名 index,因为这会造成旧 index 不可用。我们可以给 index 添加别名,达到重命名的效果。

POST <target>/_alias/<alias>

4.查询

查询一个 index 也很简单,接口调用格式如下:

GET /<index>

5.小结

本文只是简单的介绍了 index 的概念,组成和相关操作,关于 index 和 mapping 的更多操作,请参考官方文档 Elasticsearch Guide [8.0] » REST APIs » Index APIs。


参考文献

Elasticsearch Guide [8.0] » REST APIs » Index APIs
Elasticsearch Guide [8.1] » REST APIs » Index APIs » Update mapping API
Elasticsearch Guide [8.1] » Mapping » Mapping parameters » dynamic
简书.es删除字段文章来源地址https://www.toymoban.com/news/detail-404795.html

到了这里,关于Go Elasticsearch index CRUD的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch之Index Setting:索引的静态配置与动态配置

            索引的配置项按是否可以更改分为静态配置与动态配置,所谓的 静态配置即索引创建后不能修改。 索引静态配置  【索引创建后不能修改】 index.number_of_shards:索引分片的数量。在ES层面可以通过es.index.max_number_of_shards属性设置索引最大的分片数,默认为1024,in

    2024年02月16日
    浏览(46)
  • ES 10 - 如何使用Elasticsearch的索引模板(index template)

    本文转载自:ES 10 - 如何使用Elasticsearch的索引模板(index template) - 瘦风 - 博客园 索引模板: 就是把已经创建好的某个索引的参数设置(settings)和索引映射(mapping)保存下来作为模板, 在创建新索引时, 指定要使用的模板名, 就可以直接重用已经定义好的模板中的设置和映射. (1) sett

    2024年02月15日
    浏览(37)
  • Elasticsearch Index Templates(索引模板),如何实现分布式锁

    “type”: “keyword” }, “created_at”: { “type”: “date”, “format”: “” } } } } } 代码@1:触发条件。 代码@2:索引配置定义。 代码@3:索引映射配置。 上述示例对应的JAVA示例如下: public static final void createIndexTemp() { RestHighLevelClient client = EsClient.getClient(); try { PutIndexTemplateRequ

    2024年04月22日
    浏览(36)
  • Elasticsearch 索引文档时create、index、update的区别【学习记录】

    本文基于elasticsearch7.3.0版本。 一、思维导图 elasticsearch中create、index、update都可以实现插入功能,但是实现原理并不相同。 二、验证index和create 由上面思维导图可以清晰的看出create、index的大致区别,下面我们来验证下思维导图中的场景: 1、首先明确一点:如何指定是creat

    2024年01月20日
    浏览(45)
  • ElasticSearch第十六讲 ES 索引模板Index Template与Dynamic Template

    Index Templates可以帮助你设定Mappings和Settings,并按照一定的规则,自动匹配到 新创建的索引之上。模版仅在一个索引被新创建时,才会产生作用。修改模版不会影响已创建的索引,你可以设定多个索引模版,这些设置会被“merge”在一起,你可以指定“order”的数值,控制“

    2024年02月15日
    浏览(36)
  • es elasticsearch 九 索引index 定制分词器 type结构后期弃用原因 定制动态映射 动态映射模板 零停机重建索引

    目录 索引index 定制分词器 Type底层结构及弃用原因 定制 dynamic mapping 定制dynamic mapping template 动态映射模板 零停机重建索引 生产环境应该度别名数据 索引index Put /index Stings 分片 Mapping 映射 Aliases 别名 增加 Put my_index2 {        \\\"settings\\\":{           \\\"number_of_shards\\\":3,      

    2024年02月06日
    浏览(39)
  • ElasticSearch简介之倒排索引

    第二点必须准确吧,假如我搜索电脑,结果搜索出来的结果是一些奇奇怪怪的东西,要是在这时候投屏怕不是会陷入社死的尴尬吧。 第三点对于我这种比较粗心的人还是需要有一点的容忍度,哪怕输错其中一个字,也可以给出相关的搜索结果。 第四点对于大部分人而

    2024年04月15日
    浏览(32)
  • Elasticsearch的倒排索引简介

    Elasticsearch的倒排索引(Inverted Index)是其能够快速执行全文搜索查询的关键技术。为了理解倒排索引的工作原理,我们可以将其与传统的正向索引进行比较。 正向索引(Forward Index) 在正向索引中,索引是以文档为中心构建的。每个文档ID映射到它包含的一系列词汇上。例如

    2024年03月16日
    浏览(51)
  • Elasticsearch集群索引写入失败[FORBIDDEN/12/index read-only / allow delete (api)]处理流程

    操作系统:CentOS 7.3 软件版本:elasticsearch-6.7.2 正常将数据写入到Elasticsearch时,发现写入失败,出现如下报错 检查Elasticsearch集群的active master节点的日志,并没有发现error,但有WARN告警,显示与 flood stage disk watermark [90%] 有关。 上下文有 low disk watermark [80%] 的INFO日志信息,再次

    2024年02月10日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包