2017-02-23 13 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

すべての結果を取得するためにスクロールバーを使用するのはちょっと違っていますし、簡潔にするために必要なエラー処理はあまり含まれていません。

基本的にコードを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 { 
     // 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++ 
    } 
} 
関連する問題