我需要为用于批量索引查询的JsonSerializer启用对象类型处理。但是,当我更改NEST的Serializer设置时,整个大容量查询被序列化错误。
我使用的串行器:
public class SearchJsonNetSerializer : JsonNetSerializer
{
public SearchJsonNetSerializer(IConnectionSettingsValues settings)
: base(settings)
{
}
protected override void ModifyJsonSerializerSettings(JsonSerializerSettings settings)
{
settings.Formatting = Formatting.None;
settings.TypeNameHandling = TypeNameHandling.Objects;
}
}
我得到的输出:
{"index":{"$type":"Nest.BulkIndexOperation`1[[TestProject.TestDTO, TestProject]], Nest","_type":"testdto","_id":"146949756709543936"}}
{"$type":"TestProject.TestDTO, TestProject","Id":146949756709543936,"Title":"test","TitleRaw":"test"}
第二行是正确的,但是,NEST使用序列化程序设置以完全破坏请求的方式序列化了初始行。
是否有一种方法可以将更改后的序列化仅应用于实际对象?如果没有,有没有办法发送一个原始的、准备好的json字符串作为批量查询的请求?我在旧版本中看到过这种功能,但在当前的2.0版本中,我就是找不到实现这一功能的方法。。。
这与https://github.com/elastic/elasticsearch-net/issues/1155
遗憾的是,您无法在JSON.NET
中执行以下操作
[JsonObject(TypeNameHandling = TypeNameHandling.Objects)]
public class MyPoco {}
这将解决手头的问题,只为您的特定类型启用类型名称处理。遗憾的是,它只能在属性上指定。会在那里提出一个很好的功能要求。
您有两种选择,一种是为您的类型编写自定义序列化程序,另一种是保存它们并使用低级别客户端发送它们,但您还需要手动添加元数据项。
var client = new ElasticClient().LowLevel.Bulk<BulkResponse>("index", "type", new[]
{
"",
});
NEST确实提供了几种方法来获得真正的协变搜索结果,而不必索引$type
:
https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/covariant-search-results.html