在 Elasticsearch 中,可以使用各种查询来搜索和过滤文档。以下是一些常见的查询类型:
匹配查询
匹配查询是最简单和最基本的查询类型之一,用于查找一个或多个字段中包含指定字符串的文档。在 Go 中,可以使用 MatchQuery
来执行匹配查询。
import (
"context"
"fmt"
"github.com/elastic/go-elasticsearch/v7"
"github.com/elastic/go-elasticsearch/v7/esapi"
)
func main() {
es, _ := elasticsearch.NewDefaultClient()
var buf bytes.Buffer
query := map[string]interface{}{
"query": map[string]interface{}{
"match": map[string]interface{}{
"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 getting response: %s", err)
}
}
范围查询
范围查询用于查找指定字段中符合指定范围条件的文档。在 Go 中,可以使用 RangeQuery
来执行范围查询。
import (
"context"
"fmt"
"github.com/elastic/go-elasticsearch/v7"
"github.com/elastic/go-elasticsearch/v7/esapi"
)
func main() {
es, _ := elasticsearch.NewDefaultClient()
var buf bytes.Buffer
query := map[string]interface{}{
"query": map[string]interface{}{
"range": map[string]interface{}{
"age": map[string]interface{}{
"gte": 30,
"lte": 40,
},
},
},
}
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 getting response: %s", err)
}
}
多条件查询
多条件查询允许同时使用多个查询条件来过滤文档。在 Go 中,可以使用 BoolQuery
来执行多条件查询。
import (
"context"
"fmt"
"github.com/elastic/go-elasticsearch/v7"
"github.com/elastic/go-elasticsearch/v7/esapi"
)
func main() {
es, _ := elasticsearch.NewDefaultClient()
var buf bytes.Buffer
query := map[string]interface{}{
"query": map[string]interface{}{
"bool": map[string]interface{}{
"must": []map[string]interface{}{ // 所有子条件必须匹配
{"match": {"name": "John"}},
{"range": {"age": {"gte": 30}}},
},
"should": []map[string]interface{}{ // 至少有一个子条件匹配
{"match_phrase_prefix":{"description":"quick brown fox"}},
{"term":{"is_published":true}},
},
"must_not": []map[string]interface{}{ // 所有子条件都不匹配
{"match": {"gender": "female"}},
},
},
},
}
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 getting response: %s", err)
}
}
以上是 Elasticsearch 中常见的查询类型和 Go 客户端库中对应的使用方法。可以根据具体需求来选择合适的查询类型和选项来搜索和过滤文档。