使用elasticsearch3中的golang SDK可以方便地对elasticsearch进行操作,包括索引的创建、文档的增删改查等操作。

## 创建索引和映射

首先,我们需要在elasticsearch中创建索引和定义映射。以下是一个示例,创建一个名为"example_index"的索引,并定义一个名为"example_doc"的文档类型。

```go
client, err := elastic.NewClient(elastic.SetURL("http://localhost:9200"))
if err != nil {
// handle error
}

mapping := `{
"mappings": {
"example_doc": {
"properties": {
"title": {
"type": "keyword"
},
"content": {
"type": "text"
}
}
}
}
}`

createIndex, err := client.CreateIndex("example_index").BodyString(mapping).Do(context.Background())
if err != nil {
// handle error
}
if !createIndex.Acknowledged {
// index creation not acknowledged
}
```

上述代码创建了一个名为"example_index"的索引,并定义了一个文档类型为"example_doc"。其中,"title"字段的类型为"keyword",用于精确匹配,"content"字段的类型为"text",用于全文搜索。

## 新增文档

一旦索引和映射已经创建好,我们可以新增文档到elasticsearch中。

```go
doc := struct {
Title string `json:"title"`
Content string `json:"content"`
}{
Title: "example title",
Content: "example content",
}

index, err := client.Index().Index("example_index").Type("example_doc").BodyJson(doc).Do(context.Background())
if err != nil {
// handle error
}
if index.Created {
// document created
}
```

上述代码使用结构体来表示文档的数据,然后将其以JSON的形式新增到名为"example_index"的索引的"example_doc"类型中。

## 查询文档

查询是elasticsearch中一个重要的功能。我们可以使用各种查询条件和过滤器来检索匹配的文档。

```go
query := elastic.NewBoolQuery().Must(
elastic.NewTermQuery("title", "example"),
elastic.NewMatchQuery("content", "keyword")
)

search, err := client.Search().Index("example_index").Type("example_doc").Query(query).Do(context.Background())
if err != nil {
// handle error
}

if search.Hits.TotalHits.Value > 0 {
// process search results
for _, hit := range search.Hits.Hits {
// handle hit
var doc struct {
Title string `json:"title"`
Content string `json:"content"`
}
err := json.Unmarshal(hit.Source, &doc)
if err != nil {
// handle error
}
fmt.Println(doc.Title, doc.Content)
}
}
```

上述代码使用布尔查询包含了两个条件,一个是"example"出现在"Title"字段中的文档,另一个是"keyword"出现在"Content"字段中的文档。然后执行搜索,并遍历搜索结果。

以上是elasticsearch3中使用golang进行操作的简单示例。实际使用时,可以根据需求进行更复杂的查询和操作,并根据业务逻辑进行错误处理和结果处理。