英文:
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++
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论