2017-02-23 81 views
0

我的问题是特定于我正在使用的“gopkg.in/olivere/elastic.v2”软件包。返回elasticsearch查询中的所有文档

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

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 
} 

的问题是,我得到一个内部服务器错误,如果我增加大小的东西大。如果我省掉了那条线:

From(0).Size(9). 

然后使用默认值(10个文件)。我怎样才能退回所有文件?

+1

我使用相同的库和非常类似的搜索与字符串查询没有问题。你能分享有关错误的更多细节,并澄清“大”的含义吗? – Niko

+1

如果您想要检索超过10000个文档(默认限制),则需要实施滚动。您正在使用的库提供[一些示例](https://github.com/olivere/elastic/blob/release-branch.v5/scroll_test.go)了解如何执行此操作。 – Val

回答

1

使用滚动条检索所有结果只是有点不同,为简洁起见,我没有包含很多您可能需要的错误处理。

基本上你只需要稍微您的代码SearchScroller,然后循环与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 { 
     // 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++ 
    } 
} 
相关问题