返回elasticsearch查询的所有文档。

huangapple go评论90阅读模式
英文:

Return all documents from elasticsearch query

问题

我的问题是关于我正在使用的"gopkg.in/olivere/elastic.v2"包。

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

termQuery := elastic.NewTermQuery("item_id", item_id)
searchResult, err := es.client.Search().
	Index(index).
	Type(SegmentsType). // 搜索段类型
	Query(termQuery).   // 指定查询
	Sort("time", true). // 按"user"字段升序排序
	From(0).Size(9).
	Pretty(true). // 打印请求和响应的JSON
	Do()          // 执行
if err != nil {
	// 处理错误
	return timeline, err
}

问题是,如果我将大小增加到一个较大的值,我会收到内部服务器错误。如果我删除以下行:

From(0).Size(9).

那么将使用默认值(10个文档)。我该如何返回所有文档?

英文:

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?

答案1

得分: 9

使用滚动器来检索所有结果有一点不同,为了简洁起见,我没有包含太多可能需要的错误处理。

基本上,你只需要稍微修改你的代码,从Search改为Scroller,然后使用Scroller循环调用Do方法并处理结果的页面。

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 {
        // 没有剩余匹配搜索条件的文档,所以跳出循环
        break
    }
    for _, hit := range res.Hits.Hits {
        // 对从索引中检索到的每个文档进行 JSON 解析或其他操作
        item := make(map[string]interface{})
        err := json.Unmarshal(*hit.Source, &item)
        docs++
    }
}

以上是修改后的代码,使用滚动器来检索结果。

英文:

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++
	}
}

huangapple
  • 本文由 发表于 2017年2月24日 05:42:56
  • 转载请务必保留本文链接:https://go.coder-hub.com/42426733.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定