Share via


大規模な結果セットの改ページ

大きい数値の検索結果 (例: 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.SimpleDataRowDocId を見つけることができます。 DocId 値が 10 であるとします。 これは、2 ページ目の DocID 制限として次のように使用します。

2 ページ目では、次のクエリを使用します。ここでは、DocId を昇順に並べ替えたリストを引き続き使用する必要があり、さらに IndexDocId 制限を追加する必要があります。

GET http://{site_url}/_api/search/query?querytext='sharepoint indexdocid>10'&amp;sortlist='[docid]:ascending'

結果にある最後のエントリの DocId 値が 20 だとします。

3 ページ目では、次のように前のページと同じパターンでクエリを続行します。

GET http://{site_url}/_api/search/query?querytext='sharepoint indexdocid>20'&amp;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])。