在NEST中发送原始大容量索引查询或以特定方式仅序列化文档



我需要为用于批量索引查询的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

最新更新