Elasticsearch(四)【Elasticsearch.Net之Post数据】

Post数据

低层客户端允许您直接发布stringbyte[] 数组。 除此之外,如果您传递一个stringobject的集合,它们将使用Elasticsearch的特殊bulk/multi (批量/多)格式进行序列化。

隐式转换

即使在低级别客户端上PostData的参数需要PostData<object>,您可以依靠隐式转换来完全抽象PostData的概念。 您可以从以下类型隐式转换

  • string
  • byte[]
  • collection of string
  • collection of object
  • object

我们来演示一些断言的例子

PostData<object> fromString = @string;
PostData<object> fromByteArray = bytes;
PostData<object> fromListOfString = collectionOfStrings;
PostData<object> fromListOfObject = collectionOfObjects;
PostData<object> fromObject = @object;

fromByteArray.WrittenBytes.Should().BeSameAs(bytes);

WrittenBytes将始终设置,如果它源自byte[]

var fromString = ImplicitlyConvertsFrom(@string);

var fromByteArray = ImplicitlyConvertsFrom(bytes);
var fromListOfString = ImplicitlyConvertsFrom(listOfStrings);
var fromListOfObject = ImplicitlyConvertsFrom(listOfObjects);
var fromObject = ImplicitlyConvertsFrom(@object);

PostData字节始终设置,如果它源自byte[]

romByteArray.WrittenBytes.Should().BeSameAs(bytes);

fromString.Type.Should().Be(PostType.LiteralString);
fromByteArray.Type.Should().Be(PostType.ByteArray);
fromListOfString.Type.Should().Be(PostType.EnumerableOfString);
fromListOfObject.Type.Should().Be(PostType.EnumerableOfObject);
fromObject.Type.Should().Be(PostType.Serializable);

Type属性代表构建post数据的原始类型

fromString.Type.Should().Be(PostType.LiteralString);
fromByteArray.Type.Should().Be(PostType.ByteArray);
fromListOfString.Type.Should().Be(PostType.EnumerableOfString);
fromListOfObject.Type.Should().Be(PostType.EnumerableOfObject);
fromObject.Type.Should().Be(PostType.Serializable);

并将PostData<object>实例传递给接受PostData<object>作为参数的方法不会再次包装

fromString = MethodThatAcceptsPostData(fromString);
fromByteArray = MethodThatAcceptsPostData(fromByteArray);
fromListOfString = MethodThatAcceptsPostData(fromListOfString);
fromListOfObject = MethodThatAcceptsPostData(fromListOfObject);
fromObject = MethodThatAcceptsPostData(fromObject);

fromString.Type.Should().Be(PostType.LiteralString);
fromByteArray.Type.Should().Be(PostType.ByteArray);
fromListOfString.Type.Should().Be(PostType.EnumerableOfString);
fromListOfObject.Type.Should().Be(PostType.EnumerableOfObject);
fromObject.Type.Should().Be(PostType.Serializable);

每个隐式转换的类型的行为略有不同。
对于string,在请求中发送UTF-8字节,并为该字节分配WrittenBytes属性

await Post(() => @string, writes: Utf8Bytes(@string), writtenBytesIsSet: true, settings: settings);

类似地,对于byte[],字节逐字地发送,WrittenBytes属性被分配字节

await Post(() => bytes, writes: bytes, writtenBytesIsSet: true, settings: settings);

当传递string的集合时,客户端会认为它是有效的序列化json的集合,因此每个都加入换行符,确保有一个尾随的换行符。 与stringbyte[]一样,WrittenBytes属性分配了字符串集合的UTF-8字节

await Post(() => collectionOfStrings, writes: utf8BytesOfListOfStrings, writtenBytesIsSet: true, settings: settings);

当传递object的集合时,客户端会认为它是一个需要单独序列化的对象的集合,并且与换行符加入。 与收集字符串一样,客户端确保有一个尾随的换行符。

await Post(() => collectionOfObjects, writes: utf8BytesOfCollectionOfObjects, writtenBytesIsSet: false, settings: settings);

在所有其他情况下,Post数据按原样序列化,WrittenBytes未分配

await Post(() => @object, writes: utf8ObjectBytes, writtenBytesIsSet: false, settings: settings);

强制写入字节设置

如果要保留出现的请求的副本,可以在ConnectionConfiguration上设置DisableDirectStreaming。 在这样做时,序列化的字节首先被写入专用的MemoryStream,以便客户机可以获得串行化的字节

settings = new ConnectionConfiguration().DisableDirectStreaming();

await Post(() => collectionOfObjects, writes: utf8BytesOfCollectionOfObjects, writtenBytesIsSet: true, settings: settings);

当使用DisableDirectStreaming启用序列化简单对象时也可以观察到此行为

await Post(() => @object, writes: utf8ObjectBytes, writtenBytesIsSet: true, settings: settings);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值