3

Azure Search .Net SDK は、要求されたすべての結果を要求に返さない可能性があります。この場合、結果 ( DocumentSearchResult ) の一部としてContinuationTokenが返されます。

ここから:

Azure Search が 1 つの応答にすべての結果を含めることができない場合、返される応答には、さらに結果を取得するために ContinueSearch に渡すことができる継続トークンが含まれます。詳細については、DocumentSearchResultBase.ContinuationToken を参照してください。このメソッドは、検索結果のページングの実装を支援するためのものではないことに注意してください。Top パラメーターと Skip パラメーターを Search メソッドに使用して、ページングを実装できます。

そのため、ContinuationToken が返されたら、 ContinueSearchを呼び出して残りの結果を取得することをお勧めします。

Type の 2 つのオブジェクトDocumentSearchResult<T>(1 つは元の Search からのもので、もう 1 つは ContinueSearch からのもの) を組み合わせて、すべての結果を一緒に消費者に返すことができるようにするための最良/推奨される方法は何ですか?

これが私の最初の刺し傷です(「PerformSearch」は、すべての結果を返す必要がある呼び出されるメソッドです):

    private DocumentSearchResult<T> PerformSearch<T>(string searchText, SearchParameters searchParameters) where T : class
    {
        var searchIndexClient = GetSearchIndexClient<T>();
        var searchResults = searchIndexClient.Documents.Search<T>(searchText, searchParameters);
        if (searchResults.ContinuationToken != null)
        {
            ContinueSearch(searchResults, searchIndexClient, searchResults.ContinuationToken);
        }

        return searchResults;
    }

    private void ContinueSearch<T>(DocumentSearchResult<T> previousResults, SearchIndexClient searchIndexClient, SearchContinuationToken continuationToken) where T : class
    {
        var results = searchIndexClient.Documents.ContinueSearch<T>(continuationToken);
        previousResults.AddResults(results);
        if (results.ContinuationToken != null)
        {
            ContinueSearch(previousResults, searchIndexClient, results.ContinuationToken);
        }
    }

    public static void AddResults<T>(this DocumentSearchResult<T> first, DocumentSearchResult<T> second) where T : class
    {
        foreach (var searchResult in second.Results)
        {
            first.Results.Add(searchResult);
        }

        foreach (var facet in second.Facets)
        {
            first.Facets.Add(facet.Key, facet.Value);
        }
    }
4

2 に答える 2

1

例のように結果を組み合わせることができますが、ファセットを組み合わせても意味がありません。これは、返される結果のスライスだけでなく、リクエストごとにクエリの結果全体にわたってファセットが計算されるためです。一連のContinueSearchリクエストを行い、その間にインデックスが変更されなかった場合、毎回まったく同じファセットが返されるはずです。インデックスが変更され、最新のファセット結果が必要な場合は、最終結果をクライアントに返します。

これを行うための推奨される方法について$topは、結果の全体的なサイズを制限するために使用するか、非常に大きな結果セットを処理する準備ができていない限り、実際にはお勧めしません。Azure Search では、正当な理由で応答のサイズが制限されます。また、サービスを作成していると仮定すると、これらの理由はおそらくあなたにも当てはまります。

IEnumerable<SearchResult<T>>クライアントを作成している場合は、結果 ( ) に反復子を実装してみてください。

于 2016-11-03T21:01:26.050 に答える