using Nest; using TrackCenter.Domain.Consts; using TrackCenter.Domain.SeedWork; namespace TrackCenter.Repository.ES; /// /// es extensions /// public static class EsExtensions { /// /// 轨迹明细实际写入月度索引 track_details-yyyy.MM;读请求走通配符, /// 无匹配索引时返回空结果(首次部署 / 尚未 Migrate 别名)。 /// public static SearchDescriptor UseTrackDetailsIndex(this SearchDescriptor descriptor) where T : class { return descriptor .Index($"{GlobalConst.TrackDetailsIndex}-*") .IgnoreUnavailable() .AllowNoIndices(); } /// /// 轨迹明细按查询更新:目标索引不存在时视为无匹配文档。 /// public static UpdateByQueryDescriptor UseTrackDetailsIndex(this UpdateByQueryDescriptor descriptor) where T : class { return descriptor .Index($"{GlobalConst.TrackDetailsIndex}-*") .IgnoreUnavailable() .AllowNoIndices(); } public static DeleteByQueryDescriptor UseTrackDetailsIndex(this DeleteByQueryDescriptor descriptor) where T : class { return descriptor .Index($"{GlobalConst.TrackDetailsIndex}-*") .IgnoreUnavailable() .AllowNoIndices(); } /// /// 索引/别名不存在(含 NEST 对 404 的包装错误)。 /// public static bool IsIndexUnavailable(this IResponse response) { if (response.IsValid) return false; if (response.ApiCall?.HttpStatusCode == 404) return true; if (IsIndexNotFoundType(response.ServerError?.Error?.Type) || IsIndexNotFoundType(response.ServerError?.Error?.CausedBy?.Type)) return true; var rootCauses = response.ServerError?.Error?.RootCause; if (rootCauses != null && rootCauses.Any(x => IsIndexNotFoundType(x.Type))) return true; // NEST: Invalid NEST response built from a successful (404) low level call on POST: /track_details/_search var debug = response.DebugInformation; if (!string.IsNullOrEmpty(debug) && (debug.Contains("index_not_found_exception", StringComparison.OrdinalIgnoreCase) || debug.Contains("successful (404)", StringComparison.OrdinalIgnoreCase))) return true; return false; } private static bool IsIndexNotFoundType(string? type) => string.Equals(type, "index_not_found_exception", StringComparison.OrdinalIgnoreCase); /// /// return list with id /// public static List ToIdList(this ISearchResponse response) where T : IdBaseIndex { var dtos = new List(); foreach (var hit in response.Hits) { var dto = hit.Source; dto.Id = hit.Id; dtos.Add(dto); } return dtos; } public static List ToIdAndVersionList(this ISearchResponse response) where T : IdVersionIndex { var dtos = new List(); foreach (var hit in response.Hits) { var dto = hit.Source; dto.Id = hit.Id; dto.Version = hit.Version; dtos.Add(dto); } return dtos; } }