Я пытаюсь прочитать все данные из определенного индекса с помощью API прокрутки (ElasticSearch.NET-7.4.2
), но в итоге получаю следующее исключение
# FailureReason: Unrecoverable/Unexpected BadResponse while attempting POST on http://localhost:9200/_search/scroll?pretty=true&error_trace=true
- [1] BadResponse: Node: http://localhost:9200/ Exception: OverflowException Took: 00:00:00.0490000
Код выглядит следующим образом:
[ElasticsearchType]
public class SPEXEC
{
[Text(Name="event_type")]
//[JsonProperty("event_type")]
public string EventType{ get; set; }
[Text(Name="client_app_name")]
//[JsonProperty("client_app_name")]
public string ClientAppName{ get; set; }
}
var settings = new ConnectionSettings(new Uri("http://localhost:9200"))
.DefaultIndex("filebeat-7.5.2")
.EnableDebugMode()
.PrettyJson()
.RequestTimeout(TimeSpan.FromMinutes(2));
var searchResponse = client.Search<SPExec>(s => s.Index("filebeat-7.5.2-2020.03.19-000002").MatchAll().Scroll("3m").Size(1000));
while (searchResponse.Documents.Any())
{
var resp = new ISearchResponse<SPExec>
{
Results = searchResponse.Documents,
ElapsedMilliseconds = (int)searchResponse.Took,
};
searchResponse = client.Scroll<SPExec>("1m", searchResponse.ScrollId); // Overflow exception
}
client.ClearScroll(c => c.ScrollId(searchResponse.ScrollId));
Целью использования Scroll API является чтение данных из Elasti c для генерации отчетов. Я не сталкиваюсь с ошибками при использовании прокрутки в консоли разработчика.
POST filebeat-7.5.2-2020.03.19-000002/_search?scroll=1m
{
"query": {
"match_all": {}
}
, "size": 1000
}
POST /_search/scroll
{
"scroll" : "1m",
"scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAX3sWOGZwN1NKUVVUNlc1dEFxbDRSZmxtQQ=="
}
POST /_search/scroll
{
"scroll" : "1m",
"scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAX3sWOGZwN1NKUVVUNlc1dEFxbDRSZmxtQQ=="
}
Если есть что-то очевидное, что я упустил при использовании Scroll API
, направьте меня в правильном направлении. Я также запустил приложение, используя ElasticSearch-7.6.1
, и получаю то же исключение.
РЕДАКТИРОВАТЬ
Я также пытался использовать search_after , что, как предлагается в документации, предназначено для пользовательских запросов в реальном времени, которые также не были выполнены с исключением переполнения.
var searchResponse = client.Search<SPEXEC>(s => s.Index(index)
.MatchAll()
.Size(1000)
.Sort(ss => ss
.Ascending(p => p.Timestamp)
.Descending(p => p.ElasticID)));
while (true)
{
if (searchResponse.Documents.Any())
{
hitTotal += searchResponse.Hits.Count;
var searchAfter = searchResponse.Hits.Last().Sorts.ToArray();
searchResponse = client.Search<SPEXEC>(s => s.Index(index)
.MatchAll()
.Size(1000)
.Sort(ss => ss
.Ascending(p => p.Timestamp)
.Descending(p => p.ElasticID))
.SearchAfter(searchAfter));
}
else
{
System.Threading.Thread.Sleep(5 * 60 * 1000);
}
}