如何提高使用NEST客户端从Elastic Search获取数据的性能?



我使用NEST客户端从弹性搜索中获取数据。因为我已经有300000个数据,所以请求很长。我遵循这个答案

方法如下:

public static async Task<IList<T>> RockAndScroll<T>(this IElasticClient client,
string indexName,
string scrollTimeoutMinutes = "2m",
int scrollPageSize = 1000
) where T : class
{
var searchResponse = await client.SearchAsync<T>(sd => sd
.Index(indexName)
.From(0)
.Take(scrollPageSize)
.MatchAll()
.Scroll(scrollTimeoutMinutes));
var results = new List<T>();
while (true)
{
if (!searchResponse.IsValid || string.IsNullOrEmpty(searchResponse.ScrollId))
throw new Exception($"Search error: {searchResponse.ServerError.Error.Reason}");
if (!searchResponse.Documents.Any())
break;
results.AddRange(searchResponse.Documents);
searchResponse = await client.ScrollAsync<T>(scrollTimeoutMinutes, searchResponse.ScrollId);
}
await client.ClearScrollAsync(new ClearScrollRequest(searchResponse.ScrollId));
return results;
}

过滤速度也很慢:

var data = await _client.RockAndScroll<ElasticRequest>("taikunrequests");
var queryable = data.AsQueryable();
queryable = TaikunRequestListExtension.RoleManagement(request, _userAccessor.GetCurrentRole(), currentOrganization, partnerOrgs, queryable);
queryable = TaikunRequestListExtension.Sort(request, queryable);
queryable = TaikunRequestListExtension.Search(request, queryable);
queryable = TaikunRequestListExtension.Range(request, queryable);
queryable = TaikunRequestListExtension.Filter(request, queryable);
var count = queryable.Count();
var result = queryable
.Skip(request.Offset ?? 0).Take(request.Limit ?? 50).ToList();
return new TaikunRequestList(result, count);

如果我使用从和大小从巢客户端它是最大的1000,和10000搜索后,这就是我使用滚动api的原因,因为我需要在所有数据中过滤选项。是否有任何方法可以提高请求的性能或使用其他解决方案?

是否有任何方法可以提高请求的性能或使用其他解决方案?

是的。当前代码读取每个文档(MatchAll),然后在内存中查询它们(AsQueryable)。对于现实世界的数据集,这种方法的性能会很差。

你应该做的是构建一个NEST查询并将其发送给ElasticSearch。这样,ElasticSearch执行实际的查询/过滤,并且只返回匹配的文档。

相关内容

最新更新