C# 搜索多个索引并返回正确的类型
我在Elasticsearch中设置了两个索引来存储不同类型的数据,我试图同时使用nest从两个索引中获取搜索结果。我已经建立了如下模型C# 搜索多个索引并返回正确的类型,c#,.net,elasticsearch,nest,C#,.net,elasticsearch,Nest,我在Elasticsearch中设置了两个索引来存储不同类型的数据,我试图同时使用nest从两个索引中获取搜索结果。我已经建立了如下模型 public class Person { [Number(Name="person_id")] public int Id { get; set; } [Date(Name = "person_created")] public DateTime Created { get; set; } ... } public
public class Person
{
[Number(Name="person_id")]
public int Id { get; set; }
[Date(Name = "person_created")]
public DateTime Created { get; set; }
...
}
public class Work {
[Number(Name="work_id")]
public int Id { get; set; }
[Date(Name = "work_created")]
public DateTime Created { get; set; }
...
}
当查询单个索引时,我可以执行以下操作,并将结果映射回我的模型类型
var request = new SearchRequest("works")
{
From = searchQuery.Offset,
Size = searchQuery.PageSize,
Query = new QueryStringQuery { Query = searchQuery.SearchTerm },
};
var result = _elasticClient.Search<Work>(request);
但是,当执行如下查询时,如何告诉nest每个索引要将结果映射到哪些类型
var request = new SearchRequest("works,person")
{
...
}
var result = _elasticClient.Search<object> ...
我看到的其他答案建议执行以下操作,但我认为类型函数已在NEST 7.0中删除
client.Search<object>(s => s
.Size(100)
.SearchType(SearchType.Count)
.Type(Types.Type(typeof(Dog), typeof(Cat)))
如果您控制文档索引,您可以利用NEST中的过程,将.NET type放在elasticsearch索引中的文档中。这样,NEST将把文档反序列化为正确的类型
class Program
{
public class Person
{
[Number(Name="person_id")]
public int Id { get; set; }
[Date(Name = "person_created")]
public DateTime Created { get; set; }
}
public class Work
{
[Number(Name="work_id")]
public int Id { get; set; }
[Date(Name = "work_created")]
public DateTime Created { get; set; }
}
static void Main(string[] args)
{
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var connectionSettings =
new ConnectionSettings(pool,
sourceSerializer: (builtin, settings) => new JsonNetSerializer(builtin, settings,
() => new JsonSerializerSettings {TypeNameHandling = TypeNameHandling.All}
));
var client = new ElasticClient(connectionSettings);
var deleteIndexResponse = client.Indices.Delete("person,work");
var createIndexResponse = client.Indices
.Create("person", i => i.Map<Person>(m => m.AutoMap()));
var createIndexResponse2 = client.Indices
.Create("work", i => i.Map<Work>(m => m.AutoMap()));
client.Index(new Person {Id = 1, Created = DateTime.UtcNow},
i => i.Index("person"));
client.Index(new Work {Id = 1, Created = DateTime.UtcNow},
i => i.Index("work"));
client.Indices.Refresh();
var searchResponse = client.Search<object>(s => s
.Index("person,work")
.Query(q => q.MatchAll()));
foreach (var document in searchResponse.Documents)
{
Console.WriteLine($"Person? {document is Person} Work? {document is Work}");
}
}
}
需要在项目中安装程序包
希望有帮助。效果很好!谢谢我不得不稍微改变我们的过程,以便通过NEST创建索引,因为手动添加$type字段似乎不起作用,但现在一切都很好。
Person? True Work? False
Person? False Work? True