dongmen1860
2017-02-23 21:42
浏览 832

从elasticsearch查询返回所有文档

My question is specific to the "gopkg.in/olivere/elastic.v2" package I am using.

I am trying to return all documents that match my query:

termQuery := elastic.NewTermQuery("item_id", item_id)
searchResult, err := es.client.Search().
    Index(index).
    Type(SegmentsType). // search segments type
    Query(termQuery).   // specify the query
    Sort("time", true). // sort by "user" field, ascending
    From(0).Size(9).
    Pretty(true). // pretty print request and response JSON
    Do()          // execute
if err != nil {
    // Handle error
    return timeline, err
}

The problem is I get an internal server error if I increase the size to something large. If I eliminate the line that states:

From(0).Size(9).

then the default is used (10 documents). How may I return all documents?

图片转代码服务由CSDN问答提供 功能建议

我的问题仅针对我使用的“ gopkg.in/olivere/elastic.v2”软件包。

我正尝试返回与查询匹配的所有文档:

  termQuery:= elastic.NewTermQuery(“ item_id”,item_id)
searchResult  ,err:= es.client.Search()。
索引(索引)。
类型(SegmentsType)。  //搜索细分类型
 Query(termQuery)。  //指定查询
 Sort(“ time”,true)。  //按“用户”字段排序,升序
 From(0).Size(9)。
 Pretty(true)。  //漂亮的打印请求和响应JSON 
 Do()// execute 
if err!= nil {
 //处理错误
返回时间轴,err 
} 
   
  
 

问题是,如果我将大小增加到更大的大小,则会收到内部服务器错误。 如果我删除指出以下内容的行:

  From(0).Size(9)。
   
 
 

然后 使用默认值(10个文档)。 如何退回所有文件?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • duanmeng1950 2017-02-25 17:18
    已采纳

    Using a scroller to retrieve all results is just a bit different and in the interest of brevity I'm not including much error handling that you might need.

    Basically you just need to slightly change your code from Search to Scroller and then loop with the Scroller calling Do and handling pages of results.

    termQuery := elastic.NewTermQuery("item_id", item_id)
    scroller := es.client.Scroller().
        Index(index).
        Type(SegmentsType). 
        Query(termQuery).   
        Sort("time", true). 
        Size(1)
    
    docs := 0
    for {
        res, err := scroller.Do(context.TODO())
        if err == io.EOF {
            // No remaining documents matching the search so break out of the 'forever' loop
            break
        }
        for _, hit := range res.Hits.Hits {
            // JSON parse or do whatever with each document retrieved from your index
            item := make(map[string]interface{})
            err := json.Unmarshal(*hit.Source, &item)
            docs++
        }
    }
    
    点赞 评论

相关推荐 更多相似问题