ZBLOG

golang es 匹配查询,范围查询,多条件查询

在 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 客户端库中对应的使用方法。可以根据具体需求来选择合适的查询类型和选项来搜索和过滤文档。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=6768

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?