Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 搜索多个索引并返回正确的类型_C#_.net_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Nest - Fatal编程技术网 elasticsearch,nest,C#,.net,elasticsearch,Nest" /> elasticsearch,nest,C#,.net,elasticsearch,Nest" />

C# 搜索多个索引并返回正确的类型

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

我在Elasticsearch中设置了两个索引来存储不同类型的数据,我试图同时使用nest从两个索引中获取搜索结果。我已经建立了如下模型

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