除了索引和文档操作外,官方 Elasticsearch 客户端库还提供了许多其他功能,例如:
搜索
可以使用 Search API 来搜索指定索引中的文档。以下是一个示例:
searchBody := `{
"query": {
"match": {
"name": "John"
}
}
}`
res, err := es.Search(
es.Search.WithIndex("my-index"),
es.Search.WithBody(strings.NewReader(searchBody)),
es.Search.WithContext(context.Background()),
)
if err != nil {
log.Fatalf("Error searching documents: %s", err)
}
defer res.Body.Close()
var r map[string]interface{}
if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
log.Fatalf("Error parsing the response body: %s", err)
}
hits := r["hits"].(map[string]interface{})["hits"].([]interface{})
for _, hit := range hits {
doc := hit.(map[string]interface{})["_source"].(map[string]interface{})
fmt.Printf("Name: %s, Age: %d\n", doc["name"], int(doc["age"].(float64)))
}
聚合
可以使用 Aggregation API 来聚合指定索引中的文档。以下是一个示例:
aggsBody := `{
"aggs": {
"avg_age": {
"avg": {
"field": "age"
}
},
"max_age": {
"max": {
"field": "age"
}
}
}
}`
res, err := es.Search(
es.Search.WithIndex("my-index"),
es.Search.WithBody(strings.NewReader(aggsBody)),
es.Search.WithContext(context.Background()),
)
if err != nil {
log.Fatalf("Error aggregating documents: %s", err)
}
defer res.Body.Close()
var r map[string]interface{}
if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
log.Fatalf("Error parsing the response body: %s", err)
}
aggs := r["aggregations"].(map[string]interface{})
avgAge := aggs["avg_age"].(map[string]interface{})["value"].(float64)
maxAge := aggs["max_age"].(map[string]interface{})["value"].(float64)
fmt.Printf("Average age: %.2f, Max age: %.0f\n", avgAge, maxAge)
删除文档
删除一个已存在的文档,需要指定文档 ID。以下是一个示例:
res, err := es.Delete(
"my-index",
"1",
es.Delete.WithContext(context.Background()),
)
if err != nil {
log.Fatalf("Error deleting document: %s", err)
}
defer res.Body.Close()
fmt.Println("Document deleted")
以上是一些官方 Elasticsearch 客户端库中可用的功能示例。除了这些操作,还可以使用许多其他选项和参数来自定义操作。