我需要为巢搜索创建一个类型吗?
本文关键字:一个 类型 创建 搜索 | 更新日期: 2023-09-27 18:08:50
我看到这样的例子:
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>
类型吗?
谢谢
我已经成功地使用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);
}
}
还有一个解决方案。巢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);
}
巢6。x附带一个阴影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);