3

Azure Search .Net SDK 可能不会将所有请求的结果返回到请求。在这种情况下,它将返回一个ContinuationToken作为结果 ( DocumentSearchResult ) 的一部分。

从这里:

如果 Azure 搜索无法在单个响应中包含所有结果,则返回的响应将包含一个可以传递给 ContinueSearch 以检索更多结果的延续令牌。有关详细信息,请参阅 DocumentSearchResultBase.ContinuationToken。请注意,此方法并非旨在帮助您实现搜索结果的分页。您可以使用 Search 方法的 Top 和 Skip 参数实现分页。

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

结合两个 Type 对象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);
        }
    }
4

2 回答 2

1

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

至于推荐的方法是什么,我实际上不推荐它,除非你$top用来限制结果的整体大小,或者你准备好处理非常大的结果集。Azure 搜索限制响应的大小是有充分理由的,这些原因可能也适用于你,假设你也在编写服务。

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

于 2016-11-03T21:01:26.050 回答
-1

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

 dicA.Concat(dicB).ToDictionary(kvp => kvp.Key, kvp => kvp.Value)
于 2016-11-03T09:47:55.727 回答