private void SetResponseNextFrom(BpmSearchResponse bpmSearchResponse, ESSearchResponse esSearchResponse, SearchRequestQuery searchRequestQuery) { var lastNeededHitId = bpmSearchResponse.Data.Last().Id; var lastIndexFromElasticResponce = esSearchResponse.SearchResult.Hits.ToList() .FindIndex(x => string.Equals(x.Id, lastNeededHitId, StringComparison.InvariantCultureIgnoreCase)); bpmSearchResponse.NextFrom = searchRequestQuery.From + lastIndexFromElasticResponce + 1; }
private SearchRequestQuery GetDefaultSearchRequestQuery(int countRecord, int pageNum, int from) { var size = countRecord + AdditionalRecordsCount; var searchRequestQuery = new SearchRequestQuery { From = from + pageNum * size, Size = size, Source = new ESSource(), Highlight = new EShighlight() }; return(searchRequestQuery); }
public string Search(string queryString, string sectionEntityName, int recordCount, string type = "", int from = 0) { int pageNum = 0; int totalFoundRecordCount = -1; SearchRequestQuery searchRequestQuery = null; BpmSearchResponse bpmSearchResponse = null; while (GetNeedLoadNextPage(bpmSearchResponse, searchRequestQuery, totalFoundRecordCount, recordCount)) { searchRequestQuery = SearchHelper.GetSearchScoreRequestQuery(queryString, sectionEntityName, recordCount, pageNum, from); var request = PrepareRequest(searchRequestQuery, type); IRestResponse response = ExecutePostRequest(request); if (response.ResponseStatus != RestSharp.ResponseStatus.Completed) { var errorMessage = GetErrorResponse(response); return(JsonSerializer.Serialize(errorMessage)); } var esSearchResponse = JsonConvert.DeserializeObject <ESSearchResponse>(response.Content); if (esSearchResponse.SearchResult == null) { _metricReporter.Report(new ErrorMetric { SearchErrorCode = GlobalSearchErrorCode.ElasticError }); return(JsonSerializer.Serialize(GetErrorResponse(response, new ErrorInfo { Message = "Search result is empty", ErrorCode = "EmptyResult" }))); } _metricReporter.Report(new SearchMetric { Duration = esSearchResponse.Took }); var processedEsResponse = SearchHelper.ProccessESSearchResponse(esSearchResponse); totalFoundRecordCount = processedEsResponse.Total; if (bpmSearchResponse == null) { bpmSearchResponse = processedEsResponse; } else { bpmSearchResponse.Data.AddRange(processedEsResponse.Data); } if (bpmSearchResponse.Data.Count >= recordCount) { bpmSearchResponse.Data = bpmSearchResponse.Data.Take(recordCount).ToList(); SetResponseNextFrom(bpmSearchResponse, esSearchResponse, searchRequestQuery); } pageNum++; } return(JsonSerializer.Serialize(bpmSearchResponse)); }
private bool GetNeedLoadNextPage(BpmSearchResponse bpmSearchResponse, SearchRequestQuery searchRequestQuery, int totalFoundRecordCount, int recordCount) { return(GetNeedLoadRecords(recordCount, bpmSearchResponse) && HasAvailableElasticRecords(searchRequestQuery, totalFoundRecordCount)); }
private bool HasAvailableElasticRecords(SearchRequestQuery searchRequestQuery, int totalFoundRecordCount) { return(searchRequestQuery == null || searchRequestQuery.From + searchRequestQuery.Size < totalFoundRecordCount); }