Azure Search .Net SDK - 在调用 ContinueSearch<T> 后合并 DocumentSearchResult<T> 类型结果的推荐方法是什么?

Azure Search .Net SDK - What's the recommended way to combine results of type DocumentSearchResult<T> after calling ContinueSearch<T>?

Azure Search .Net SDK 可能不会 return 将所有请求的结果都添加到一个请求中。在这种情况下,它将 return a ContinuationToken as part of the result (DocumentSearchResult).

From here:

If Azure Search can't include all results in a single response, the response returned will include a continuation token that can be passed to ContinueSearch to retrieve more results. See DocumentSearchResultBase.ContinuationToken for more information. Note that this method is not meant to help you implement paging of search results. You can implement paging using the Top and Skip parameters to the Search method.

因此,建议在 return 编辑 ContinuationToken 时,调用 ContinueSearch 以获取其余结果。

什么是 best/recommended 合并两个类型 DocumentSearchResult<T> 对象(一个来自原始搜索,另一个来自 ContinueSearch)的方法,以便我可以 return 所有结果一起送给消费者?

这是我的第一次尝试("PerformSearch" 是要调用的方法,应该 return 所有结果):

    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);
        }
    }

我认为您不需要那些循环。方面 属性 是一个字典,假设没有重复意味着你可以这样组合:

 dicA.Concat(dicB).ToDictionary(kvp => kvp.Key, kvp => kvp.Value)

您可以像示例中那样合并结果,但合并各个方面没有意义。这是因为构面是在每个请求的整个查询结果中计算的,而不仅仅是在您返回的结果片段中。如果您发出一系列 ContinueSearch 请求并且索引在此期间没有被修改,您应该每次都返回完全相同的方面。如果您的索引正在更改并且您想要最新的方面结果,return 将最后一个结果发送给您的客户。

关于推荐的做法,我其实不推荐,除非你使用$top来限制结果的整体大小,或者你准备处理非常大的结果结果集。 Azure 搜索出于充分的原因限制响应的大小,假设您也在编写服务,这些原因可能也适用于您。

如果您正在编写客户端,也许您应该尝试对结果实施迭代器 (IEnumerable<SearchResult<T>>),尽管您必须 return 额外的信息(构面、文档计数) ) 以某种方式带外。