英文:
How to add mapping via go-elasticsearch package
问题
基本上,当我尝试将新文档插入到不存在的索引时,它会自动设置为动态映射。
但是我遇到了一个问题,有时我想要更改ES上字段的数据类型。
我想通过我的Go语言服务来设置它,但似乎go-elasticsearch包不支持?如果我错了,请纠正我。
英文:
Basically when I am trying to insert a new document to non-existing index, it is automatically sets to dynamic mapping.
But I have issues where in sometimes  I want to change the data type of the fields on the ES.
I want to set it via my go-lang service but looks like go-elasticsearch package doesn't support it? correct me if I am wrong
答案1
得分: 2
你可以使用go-elasticsearch/esapi go-elasticsearch/esapi 创建一个带有映射的索引。
创建一个如下所示的请求:
mapping := `{
	"settings": {
		"number_of_shards": 1,
		"number_of_replicas": 1
	  },
	  "mappings": {
		"properties": {
		  "name": {
			"type": "text",
			"fields": {
			  "keyword": {
				"type": "keyword",
				"ignore_above": 256
			  }
			}
		  },
		  "message": {
			"type": "text",
			"fields": {
			  "keyword": {
				"type": "keyword",
				"ignore_above": 256
			  }
			}
		  },
		}
}`
// Index - 传递索引名称
// Body - 传递映射、设置等
indexReq := esapi.IndicesCreateRequest{
	Index: "my-index",
	Body: strings.NewReader(string(mapping)),
}
resp, err := indexReq.Do(ctx, elasticclient)
if err != nil {
	// 处理错误
}
通过这种方式,你可以创建一个具有特定映射的新索引。
英文:
You can create an index along with its mapping using go-elasticsearch/esapi go-elasticsearch/esapi
Create a request as below:
mapping := `{
	"settings": {
		"number_of_shards": 1,
		"number_of_replicas": 1
	  },
	  "mappings": {
		"properties": {
		  "name": {
			"type": "text",
			"fields": {
			  "keyword": {
				"type": "keyword",
				"ignore_above": 256
			  }
			}
		  },
		  "message": {
			"type": "text",
			"fields": {
			  "keyword": {
				"type": "keyword",
				"ignore_above": 256
			  }
			}
		  },
		}
}`
// Index - pass index name
// Body - pass mapping, settings etc
indexReq := esapi.IndicesCreateRequest{
	Index: "my-index",
	Body: strings.NewReader(string(mapping)),
}
resp, err := indexReq.Do(ctx, elasticclient)
if err != nil {
	// handle error
}
by this way you can create a new index with specific mapping
答案2
得分: 0
你可以使用ElasticSearch Typed API。
创建索引的代码如下:
client := GetTypedClient()
// 如果索引不存在,则创建索引
index := "index_name"
if !isIndexExists(GetClient(), index) {
    res, err := client.Indices.Create(getIndexName(index)).Do(context.Background())
    if err != nil {
        ...
    }
}
还可以使用以下代码来设置映射:
// 更新映射
memoryMapping := types.NewNestedProperty()
memoryMapping.Properties = map[string]types.Property{
    "total": types.NewIntegerNumberProperty(),
    "free":  types.NewIntegerNumberProperty(),
    "used":  types.NewIntegerNumberProperty(),
}
uptimeMapping := types.NewNestedProperty()
uptimeMapping.Properties = map[string]types.Property{
    "app": types.NewIntegerNumberProperty(),
    "os":  types.NewIntegerNumberProperty(),
}
loadMapping := types.NewNestedProperty()
loadMapping.Properties = map[string]types.Property{
    "avg1":  types.NewFloatNumberProperty(),
    "avg5":  types.NewFloatNumberProperty(),
    "avg15": types.NewFloatNumberProperty(),
}
res, err := client.Indices.PutMapping(index).
    Request(&putmapping.Request{
        Properties: map[string]types.Property{
            "createdAt": types.NewDateProperty(),
            "memory":    memoryMapping,
            "uptime":    uptimeMapping,
            "load":      loadMapping,
        },
    }).
    Do(context.Background())
if err != nil {
    ...
}
英文:
You can use ElasticSearch Typed API
To create an index
	client := GetTypedClient()
	// create index if not exists
	index := "index_name"
	if !isIndexExists(GetClient(), index) {
		res, err := client.Indices.Create(getIndexName(index)).Do(context.Background())
		if err != nil {
			...
		}
	}
And put mapping as well
	// update mapping
	memoryMapping := types.NewNestedProperty()
	memoryMapping.Properties = map[string]types.Property{
		"total": types.NewIntegerNumberProperty(),
		"free":  types.NewIntegerNumberProperty(),
		"used":  types.NewIntegerNumberProperty(),
	}
	uptimeMapping := types.NewNestedProperty()
	uptimeMapping.Properties = map[string]types.Property{
		"app": types.NewIntegerNumberProperty(),
		"os":  types.NewIntegerNumberProperty(),
	}
	loadMapping := types.NewNestedProperty()
	loadMapping.Properties = map[string]types.Property{
		"avg1":  types.NewFloatNumberProperty(),
		"avg5":  types.NewFloatNumberProperty(),
		"avg15": types.NewFloatNumberProperty(),
	}
	res, err := client.Indices.PutMapping(index).
		Request(&putmapping.Request{
			Properties: map[string]types.Property{
				"createdAt": types.NewDateProperty(),
				"memory":    memoryMapping,
				"uptime":    uptimeMapping,
				"load":      loadMapping,
			},
		}).
		Do(context.Background())
	if err != nil {
		...
	}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论