/// <summary> /// Create a alias for the given indices. /// </summary> public async Task <string> MergeIndicesAsync(params string[] indices) { if (indices.Length < 2) { throw new ArgumentException( "At least two indices are needed to create a merged index"); } string alias = Guid.NewGuid().ToString(); IEnumerable <AliasAddDescriptor> createDescriptors = indices .Select(index => new AliasAddDescriptor() .Alias(alias) .Index(index)); BulkAliasDescriptor aliasDescriptor = new BulkAliasDescriptor(); foreach (AliasAddDescriptor aliasAddDescriptor in createDescriptors) { aliasDescriptor.Add(aliasAddDescriptor); } IBulkAliasResponse bulkAliasResponse = await Client.AliasAsync(aliasDescriptor); if (!bulkAliasResponse.IsValid) { throw new InvalidOperationException( $"Could not create alias for the indices \"{string.Join(",", indices)}\": {bulkAliasResponse.DebugInformation}", bulkAliasResponse.OriginalException); } await Client.RefreshAsync(Indices.All); return(alias); }
private void updateAlias(string alias, string index, bool close = true) { Console.WriteLine($"Updating `{alias}` alias to `{index}`..."); var aliasDescriptor = new BulkAliasDescriptor(); var oldIndices = elasticClient.GetIndicesPointingToAlias(alias); foreach (var oldIndex in oldIndices) { aliasDescriptor.Remove(d => d.Alias(alias).Index(oldIndex)); } aliasDescriptor.Add(d => d.Alias(alias).Index(index)); Console.WriteLine(elasticClient.Alias(aliasDescriptor)); // cleanup if (!close) { return; } foreach (var toClose in oldIndices.Where(x => x != index)) { Console.WriteLine($"Closing {toClose}"); elasticClient.CloseIndex(toClose); } }
private BulkAliasDescriptor RemoveIndexesFromAlias(BulkAliasDescriptor descriptor, IEnumerable <string> indexes) { foreach (var index in indexes) { descriptor = descriptor.Remove(i => i.Index(index).Alias(_aliasName)); } return(descriptor); }
protected virtual async Task UpdateAliasesAsync(IList <IndexInfo> indexes) { if (indexes.Count == 0) { return; } var aliasDescriptor = new BulkAliasDescriptor(); foreach (var indexGroup in indexes.OrderBy(i => i.Version).GroupBy(i => i.DateUtc)) { var indexExpirationDate = GetIndexExpirationDate(indexGroup.Key); // Ensure the current version is always set. if (SystemClock.UtcNow < indexExpirationDate) { var oldestIndex = indexGroup.First(); if (oldestIndex.CurrentVersion < 0) { try { await CreateAliasAsync(oldestIndex.Index, GetIndex(indexGroup.Key)).AnyContext(); } catch (Exception ex) { _logger.LogError(ex, "Error setting current index version. Will use oldest index version: {OldestIndexVersion}", oldestIndex.Version); } foreach (var indexInfo in indexGroup) { indexInfo.CurrentVersion = oldestIndex.Version; } } } foreach (var index in indexGroup) { if (SystemClock.UtcNow >= indexExpirationDate || index.Version != index.CurrentVersion) { foreach (var alias in Aliases) { aliasDescriptor = aliasDescriptor.Remove(r => r.Index(index.Index).Alias(alias.Name)); } continue; } foreach (var alias in Aliases) { if (ShouldCreateAlias(indexGroup.Key, alias)) { aliasDescriptor = aliasDescriptor.Add(r => r.Index(index.Index).Alias(alias.Name)); } else { aliasDescriptor = aliasDescriptor.Remove(r => r.Index(index.Index).Alias(alias.Name)); } } } } var response = await Configuration.Client.AliasAsync(aliasDescriptor).AnyContext(); if (_logger.IsEnabled(Microsoft.Extensions.Logging.LogLevel.Trace)) { _logger.LogTrace(response.GetRequest()); } if (!response.IsValid) { if (response.ApiCall.HttpStatusCode.GetValueOrDefault() == 404) { return; } string message = $"Error updating aliases: {response.GetErrorMessage()}"; _logger.LogError(response.OriginalException, "Error updating aliases: {0}", message); throw new ApplicationException(message, response.OriginalException); } }