大規模な結果セットの改ページ
大きい数値の検索結果 (例: 5 万超) を使用してクエリを実行する場合は、StartRow の手法の代わりに、この記事で説明する手法を使用することをお勧めします。 この手法では、[docid]
を昇順に並べ替え、新しいページごとに IndexDocID
の値が増加する IndexDocId
の値にクエリ制限を使用しています。
この手法の利点は次のとおりです。
- 改ページのパフォーマンスが向上します
- ページ数に制限はありません (StartRow の手法を使用していて
StartRow
値が 5 万を超える場合は、SharePoint によって調整されるリスクがあります)
この手法の使用例を次に示します。
1 ページ目では、次のように [docid]
を昇順に並び替えてクエリを発行します。
GET http://{site_url}/_api/search/query?querytext='sharepoint'&sortlist='[docid]:ascending'
このクエリの結果には、次の内容が含まれます。
...
<d:element m:type="SP.SimpleDataRow">
<d:Cells>
...
<d:element m:type="SP.KeyValue">
<d:Key>DocId</d:Key>
<d:Value>10</d:Value>
<d:ValueType>Edm.Int64</d:ValueType>
</d:element>
...
結果の最後のエントリの DocId
値を取得します。 SP.SimpleDataRow
で DocId
を見つけることができます。 DocId
値が 10
であるとします。 これは、2 ページ目の DocID
制限として次のように使用します。
2 ページ目では、次のクエリを使用します。ここでは、DocId
を昇順に並べ替えたリストを引き続き使用する必要があり、さらに IndexDocId
制限を追加する必要があります。
GET http://{site_url}/_api/search/query?querytext='sharepoint indexdocid>10'&sortlist='[docid]:ascending'
結果にある最後のエントリの DocId
値が 20 だとします。
3 ページ目では、次のように前のページと同じパターンでクエリを続行します。
GET http://{site_url}/_api/search/query?querytext='sharepoint indexdocid>20'&sortlist='[docid]:ascending'
残りのページについても同様です。
CSOM で同じアプローチを使用するには、次の例を参照してください。
...
if (startRow == 0) // When issueing the query for first time, we don't have a DocId value yet
keywordQuery.QueryText = "sharepoint";
else // Putting the IndexDocId first and then the 'actual' query matters (in this case searching for the keyword 'sharepoint')
keywordQuery.QueryText = string.Format("IndexDocId>{0} AND (sharepoint)", startRow);
keywordQuery.EnableSorting = true;
keywordQuery.SortList.Add("[DocId]", Microsoft.SharePoint.Client.Search.Query.SortDirection.Ascending);
...
注:
検索クエリで SortList を使用する場合、使用するフィールド名は括弧で囲む必要があります (例: [DocId]
)。