showliuzp 2025-10-14 19:54 采纳率: 84.3%
浏览 4
已结题

golang es按日期区间查询报错


//ws存储的数据结构
![img](https://i-blog.csdnimg.cn/ask/c7ee183ae8534c55be00c2e709bd958e.png "#left")
 
//写入es的结构:
func OperatorAddEs(operator,module,act string,req interface{})(err error){
    data := map[string]interface{}{
        "operator"  : operator,
        "module"    : module,
        "act"       : act,
        "req"       : req,
        "dates"     : time.Now().Format(types.DATE_NORMAL_FORMAT),
    }

    _,err = types.EsClient.Index().Index(types.ES_OPERATOR_INDEX).BodyJson(data).Do(ctx)

    return
}

es查询:
   skip := (req.Page - 1) * req.PageSize
 
    //var query elastic.Query
    boolQuery := elastic.NewBoolQuery()
 
    if (*req).Operator != "" {
        //query = elastic.NewBoolQuery().Filter(elastic.NewTermQuery("operator.keyword", (*req).Operator))
    }
 
    if (*req).StartDate != 0 && (*req).EndDate != 0 {
        start_date := tools.FormatDates(types.DATE_NORMAL_FORMAT, (*req).StartDate)
        end_date := tools.FormatDates(types.DATE_NORMAL_FORMAT, (*req).EndDate)
 
        // 创建 range 查询
        rangeQuery := elastic.NewRangeQuery("dates.keyword").Gte(start_date).Lte(end_date)
        boolQuery = boolQuery.Filter(rangeQuery)
    }
 
    if boolQuery == nil {
        boolQuery = elastic.NewBoolQuery().Must(elastic.NewMatchAllQuery())
    }
 
    list_res, err := types.EsClient.Search().
    Index(types.ES_OPERATOR_INDEX).
    Query(boolQuery).
    Sort("dates.keyword", false).
    From(skip).
    Size(req.PageSize).
    Pretty(true).
    Do(ctx)
 
//在执行查询的时候,query查询报错:
elastic: Error 400 (Bad Request): [1:71] [bool] failed to parse field [filter] [type=x_content_parse_exception]
,start_date,end_date转换为都为:yyyy-mm-dd H:i:s
  • 写回答

4条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-10-14 19:55
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析:
      - 目前仅给出了存储的数据结构图片,但没有关于查询代码以及报错信息的具体描述。所以难以确切知道问题所在。不过从一般情况推测,按日期区间查询报错可能涉及到日期格式的处理、查询语句的构建以及ES客户端与索引的交互等方面。
    2. 解决方案:
      - 假设使用官方的elastic库来进行ES查询。首先,确保日期格式在ES中是正确存储的,比如常见的ISO 8601格式(例如:”2023-10-01T00:00:00Z”)。
      - 构建查询语句时,对于日期区间查询,可以这样写:
    package main
    
    import (
        "fmt"
        "time"
    
        "github.com/elastic/go-elasticsearch/v8"
        "github.com/elastic/go-elasticsearch/v8/esapi"
    )
    
    func main() {
        // 初始化ES客户端
        es, err := elasticsearch.NewClient(elasticsearch.Config{
            Addresses: []string{"http://localhost:9200"},
        })
        if err != nil {
            fmt.Printf("Error creating client: %s", err)
            return
        }
    
        startDate := time.Date(2023, 10, 1, 0, 0, 0, 0, time.UTC)
        endDate := time.Date(2023, 10, 2, 0, 0, 0, 0, time.UTC)
    
        query := map[string]interface{}{
            "query": map[string]interface{}{
                "range": map[string]interface{}{
                    "date_field_name": map[string]interface{}{
                        "gte": startDate.Format("2006-01-02T15:04:05Z"),
                        "lt":  endDate.Format("2006-01-02T15:04:05Z"),
                    },
                },
            },
        }
    
        req := esapi.SearchRequest{
            Index: []string{"your_index_name"},
            Body:  query,
        }
    
        res, err := req.Do(context.Background(), es)
        if err != nil {
            fmt.Printf("Error getting response: %s", err)
            return
        }
        defer res.Body.Close()
    
        if res.IsError() {
            fmt.Printf("Error: %s", res.String())
            return
        }
    
        var result map[string]interface{}
        err = json.NewDecoder(res.Body).Decode(&result)
        if err != nil {
            fmt.Printf("Error parsing the response body: %s", err)
            return
        }
    
        fmt.Printf("Total hits: %d\n", result["hits"].(map[string]interface{})["total"].(map[string]interface{})["value"])
    }
    
    • 在上述代码中,date_field_name需要替换为实际存储日期的字段名,your_index_name替换为实际的索引名。
      3. 不同解决方案的优缺点:
    • 优点
      • 使用官方库elastic构建查询语句,代码结构清晰,与ES的交互较为标准,易于理解和维护。
      • 详细处理了日期格式的转换,确保与ES中存储的日期格式匹配,提高查询准确性。
    • 缺点
      • 代码相对较为冗长,对于简单查询可能显得过于复杂。
      • 依赖elastic库,如果项目对ES客户端有特殊定制需求,可能不太灵活。
        4. 总结:
        首先要明确ES中日期的存储格式,然后根据该格式正确构建日期区间查询语句。通过使用合适的ES客户端库(如elastic),按照标准的查询流程来进行操作,一般可以解决按日期区间查询报错的问题。同时,要注意检查查询语句的准确性以及与ES索引和数据结构的匹配性。

    请注意,上述代码中的context.Background()需要替换为实际的上下文环境,这里只是简单示例。并且代码中的日期格式处理等部分是基于常见需求,实际应用中可能需要根据具体情况调整。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月14日
  • 创建了问题 10月14日