我是否需要为Nest Search创建一个Type?

时间:2014-06-16 06:43:37

标签: c# database elasticsearch nest

我看到的例子如下:

var result = this._client.Search(s => s
.Index("my-index")
.Type("my-type")
 .Query(q=> ....)
 .Filter(f=> ....)         
);

但是当我使用它时,我得到:

The type arguments for method 'Nest.ElasticClient.Search<T>(System.Func<Nest.SearchDescriptor<T>,Nest.SearchDescriptor<T>>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.   

我有很多不同的类型,我不想为所有类型创建类。我可以使用NEST进行搜索而不使用Search<MyType>等类型的搜索吗?

由于

2 个答案:

答案 0 :(得分:6)

我已成功使用Search<dynamic>以避免需要依赖于特定类型。然后,当我得到我的结果时,我可以检查它们并在需要时转换/转换为特定的POCO。

我使用以下内容:

var result = client.Search<dynamic>(s => s
     .Index("myIndex")
     .AllTypes()
     .Query(q => ...)
     .Filter(f => ...)
);

foreach (var hit in result.Hits.Hits)
{
     //check hit.Type and then map hit.Source into the appropriate POCO.
     // I use AutoMapper for the mapping, but you can do whatever suits you.
     if (string.Compare(hit.Type, "myType", StringCompare.OrdinalIgnoreCase) == 0)
     {
           var myType = AutoMapper.Mapper<MyType>(hit.Source);
     }
}

答案 1 :(得分:0)

还有一个解决方案。 NEST 5.x及更少使用Newtonsoft.Json进行JSON序列化。因此,您可以使用JObject代替dynamic

var result = client.Search<JObject>(s => s
    .Index("music")
    .AllTypes()
    .Query(q => ...)
    .Filter(f => ...)
);

这非常有用,因为您现在可以使用Newtonsoft.Json功能将其转换为任何对象。

private static Dictionary<string, Type> TypeMapping = new Dictionary<string, Type>
{
    { "artist", typeof(Artist) },
    { "song", typeof(Song) }
};

...

foreach (var hit in result.Hits)
{
    var type = TypeMapping[hit.Type];
    var result = hit.Source.ToObject(type);
}

NEST 6.x附带了带阴影的Json.NET依赖项。因此,为了在此版本中使用Newtonsoft.Json,您需要安装NEST.JsonNetSerializer包并指定JsonNetSerializer.Default

var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var connectionSettings =
    new ConnectionSettings(pool, sourceSerializer: JsonNetSerializer.Default);
var client = new ElasticClient(connectionSettings);