在 Go 中,可以使用官方 Elasticsearch 客户端库来进行高级查询,包括 term、match 和聚合操作。
Term 查询
Term 查询是一个完全匹配的查询。它查找指定字段中包含指定值的文档。以下是一个示例:
import (
"context"
"fmt"
"github.com/elastic/go-elasticsearch/v7"
)
func main() {
es, _ := elasticsearch.NewDefaultClient()
var buf bytes.Buffer
query := map[string]interface{}{
"query": map[string]interface{}{
"term": map[string]string{
"name.keyword": "John",
},
},
}
if err := json.NewEncoder(&buf).Encode(query); err != nil {
log.Fatalf("Error encoding query: %s", err)
}
res, err := es.Search(
es.Search.WithContext(context.Background()),
es.Search.WithIndex("my-index"),
es.Search.WithBody(&buf),
es.Search.WithTrackTotalHits(true),
es.Search.WithPretty(),
)
if err != nil {
log.Fatalf("Error searching for 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)
}
totalHits := int(r["hits"].(map[string]interface{})["total"].(map[string]interface{})["value"].(float64))
fmt.Printf("Found %d documents\n", totalHits)
}
Match 查询
Match 查询会根据查询条件对指定字段进行分词并搜索匹配的文档。以下是一个示例:
var buf bytes.Buffer
query := map[string]interface{}{
"query": map[string]interface{}{
"match": map[string]string{
"name": "John",
},
},
}
if err := json.NewEncoder(&buf).Encode(query); err != nil {
log.Fatalf("Error encoding query: %s", err)
}
res, err := es.Search(
es.Search.WithContext(context.Background()),
es.Search.WithIndex("my-index"),
es.Search.WithBody(&buf),
es.Search.WithTrackTotalHits(true),
es.Search.WithPretty(),
)
if err != nil {
log.Fatalf("Error searching for 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)
}
totalHits := int(r["hits"].(map[string]interface{})["total"].(map[string]interface{})["value"].(float64))
fmt.Printf("Found %d documents\n", totalHits)
Aggregation
聚合操作可以对搜索结果进行统计和分析,例如计算平均值、最大值等。以下是一个示例:
var buf bytes.Buffer
aggQuery := map[string]interface{}{
"aggs": map[string]interface{}{
"avg_age": map[string]interface{}{
"avg": map[string]interface{}{
"field": "age",
},
},
},
}
query := map[string]interface{}{
"size": 0,
}
query["aggs"] = aggQuery
if err := json.NewEncoder(&buf).Encode(query); err != nil {
log.Fatalf("Error encoding query: %s", err)
}
res, err := es.Search(
es.Search.WithContext(context.Background()),
es.Search.WithIndex("my-index"),
es.Search.WithBody(&buf),
es.Search.WithTrackTotalHits(true),
es.Search.WithPretty(),
)
if err != nil {
log.Fatalf("Error searching for 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)
}
aggResult := r["aggregations"].(map[string]interface{})["avg_age"].(map[string]interface{})
avgAge := aggResult["value"].(float64)
fmt.Printf("Average age is %f\n", avgAge)
以上是在 Go 中使用官方 Elasticsearch 客户端库进行 term、match 和聚合操作的一些示例。可以根据具体需求来选择合适的选项和参数。