diff --git a/src/Nest/Document/Multiple/Bulk/ElasticClient-DeleteMany.cs b/src/Nest/Document/Multiple/Bulk/ElasticClient-DeleteMany.cs
index fb677db1d7a..915e652f001 100644
--- a/src/Nest/Document/Multiple/Bulk/ElasticClient-DeleteMany.cs
+++ b/src/Nest/Document/Multiple/Bulk/ElasticClient-DeleteMany.cs
@@ -6,7 +6,7 @@
namespace Nest
{
///
- /// Provides GetMany extensions that make it easier to get many documents given a list of ids
+ /// Provides DeleteMany extensions that make it easier to get many documents given a list of ids
///
public static class DeleteManyExtensions
{
diff --git a/src/Nest/Document/Multiple/MultiGet/ElasticClient-GetMany.cs b/src/Nest/Document/Multiple/MultiGet/ElasticClient-GetMany.cs
index a538c52d804..b61d4629072 100644
--- a/src/Nest/Document/Multiple/MultiGet/ElasticClient-GetMany.cs
+++ b/src/Nest/Document/Multiple/MultiGet/ElasticClient-GetMany.cs
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading;
@@ -11,6 +12,14 @@ namespace Nest
///
public static class GetManyExtensions
{
+ private static Func, string, IMultiGetOperation> Lookup(IndexName index)
+ where T : class
+ {
+ if (index == null) return null;
+
+ return (d, id) => d.Index(index);
+ }
+
///
/// Multi GET API allows to get multiple documents based on an index, type (optional) and id (and possibly routing).
/// The response includes a docs array with all the fetched documents, each element similar in structure to a document
@@ -29,7 +38,7 @@ public static IEnumerable> GetMany(this IElasticClient client
var result = client.MultiGet(s => s
.Index(index)
.RequestConfiguration(r => r.ThrowExceptions())
- .GetMany(ids)
+ .GetMany(ids, Lookup(index))
);
return result.GetMany(ids);
}
@@ -68,7 +77,7 @@ public static async Task>> GetManyAsync(
var response = await client.MultiGetAsync(s => s
.Index(index)
.RequestConfiguration(r => r.ThrowExceptions())
- .GetMany(ids),
+ .GetMany(ids, Lookup(index)),
cancellationToken
)
.ConfigureAwait(false);
diff --git a/src/Nest/Document/Multiple/MultiGet/ElasticClient-SourceMany.cs b/src/Nest/Document/Multiple/MultiGet/ElasticClient-SourceMany.cs
index 8c43fd152f0..4d282dda13a 100644
--- a/src/Nest/Document/Multiple/MultiGet/ElasticClient-SourceMany.cs
+++ b/src/Nest/Document/Multiple/MultiGet/ElasticClient-SourceMany.cs
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading;
@@ -11,6 +12,15 @@ namespace Nest
///
public static class SourceManyExtensions
{
+
+ private static Func, string, IMultiGetOperation> Lookup(IndexName index)
+ where T : class
+ {
+ if (index == null) return null;
+
+ return (d, id) => d.Index(index);
+ }
+
///
/// SourceMany allows you to get a list of T documents out of Elasticsearch, internally it calls into MultiGet()
///
@@ -31,7 +41,7 @@ public static IEnumerable SourceMany(this IElasticClient client, IEnumerab
var result = client.MultiGet(s => s
.Index(index)
.RequestConfiguration(r => r.ThrowExceptions())
- .GetMany(ids, (gs, i) => gs )
+ .GetMany(ids, Lookup(index))
);
return result.SourceMany(ids);
}
@@ -75,7 +85,7 @@ public static async Task> SourceManyAsync(
var response = await client.MultiGetAsync(s => s
.Index(index)
.RequestConfiguration(r => r.ThrowExceptions())
- .GetMany(ids, (gs, i) => gs), cancellationToken)
+ .GetMany(ids, Lookup(index)), cancellationToken)
.ConfigureAwait(false);
return response.SourceMany(ids);
}
diff --git a/tests/Tests.Reproduce/GitHubIssue4462.cs b/tests/Tests.Reproduce/GitHubIssue4462.cs
new file mode 100644
index 00000000000..d921322c9b9
--- /dev/null
+++ b/tests/Tests.Reproduce/GitHubIssue4462.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Text;
+using Elastic.Xunit.XunitPlumbing;
+using Elasticsearch.Net;
+using FluentAssertions;
+using Nest;
+using Tests.Domain;
+
+namespace Tests.Reproduce
+{
+ /*
+ * https://github.com/elastic/elasticsearch-net/pull/4353
+ * Fixed an issue with the GetMany helpers that returned the cartesian product of all ids specified rather
+ * then creating a distinct list if more then one index was targeted.
+ *
+ * This PR also updated the routine in the serializer to omit the index name from each item if the index is
+ * already specified on the url in case of multiple indices
+ *
+ * This updated routine in the `7.6.0` could throw if you are calling:
+ *
+ * client.GetMany(ids, "indexName");
+ *
+ * Without configuring `ConnectionSettings()` with either a default index for T or a global default index.
+ */
+ public class GitHubIssue4462
+ {
+ [U] public void GetManyShouldNotThrowIfIndexIsProvided()
+ {
+ var json = "{}";
+
+ var bytes = Encoding.UTF8.GetBytes(json);
+ var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
+ var connectionSettings = new ConnectionSettings(pool, new InMemoryConnection(bytes));
+ var client = new ElasticClient(connectionSettings);
+
+ var response = client.GetMany(new long[] {1, 2, 3}, "indexName");
+ response.Should().NotBeNull();
+ }
+
+ [U] public void SourceManyShouldNotThrowIfIndexIsProvided()
+ {
+ var json = "{}";
+
+ var bytes = Encoding.UTF8.GetBytes(json);
+ var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
+ var connectionSettings = new ConnectionSettings(pool, new InMemoryConnection(bytes));
+ var client = new ElasticClient(connectionSettings);
+
+ var response = client.SourceMany(new long[] {1, 2, 3}, "indexName");
+ response.Should().NotBeNull();
+ }
+ }
+}