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

Send raw bulk index query in NEST or serialize ONLY the document in a specific way

我需要为用于批量索引查询的 JsonSerializer 启用对象类型处理。但是,当我更改 NEST 的序列化程序设置时,批量查询被序列化为一个整体是错误的。

我使用的序列化器:

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