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