.net - Azure 搜索 .Net SDK - 在调用ContinueSearch<T> 后组合 DocumentSearchResult<T> 类型的结果的建议方法是什么?

标签 .net azure azure-cognitive-search azure-search-.net-sdk

Azure 搜索 .Net SDK 可能不会将所有请求的结果返回到请求。在这种情况下,它将返回 ContinuationToken作为结果的一部分 ( 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.

因此,建议在返回 ContinuationToken 时调用 ContinueSearch以获得其余结果。

组合 DocumentSearchResult<T> 类型的两个对象的最佳/推荐方法是什么? (一个来自原始搜索,另一个来自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);
        }
    }

最佳答案

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

就推荐的做法而言,我实际上不推荐它,除非您使用 $top限制结果的总体大小,或者您准备处理非常大的结果集。 Azure 搜索限制响应的大小有充分的理由,假设您也在编写服务,这些原因可能也适用于您。

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

关于.net - Azure 搜索 .Net SDK - 在调用ContinueSearch<T> 后组合 DocumentSearchResult<T> 类型的结果的建议方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40394246/

相关文章:

c# - 检查对象列表中是否存在对象

c# - WriteAllBytes - 拒绝访问路径

windows - 在 Azure Blob 存储中存储我的角色服务包有多安全?

c# - 如果我快速连续运行多个 Azure 搜索索引器,是否有办法访问 Azure SDK 中的等待索引器队列?

azure-cognitive-search - Azure 搜索同义词未反射(reflect)在结果中

c# - Android 上的 .NET 框架

.net - 来自多个项目的单个装配

Azure WebJobs 和队列相关指标

azure - 如何使用带通配符的 AzureSearch

azure - 如何使用多个单词自动完成