如何在 NEST 客户端的附件数组中使用附件处理器和删除处理器?
How to use the attachment processor and remove processor within an array of attachments with NEST client?
问题描述
我想使用附件处理器并删除附件数组中的处理器。我知道为此目的需要 foreach 处理器。
这使得附加处理器和删除处理器能够在数组的各个元素上 运行 (https://www.elastic.co/guide/en/elasticsearch/plugins/current/ingest-attachment-with-arrays.html)
我找不到任何好的 NEST(c#) 示例来索引附件数组和删除内容字段。有人可以为我的用例提供 NEST(C#) 示例吗?
更新:感谢 Russ Cam,现在可以索引附件数组并使用以下管道删除 base64 编码的文件内容:
_client.PutPipeline("attachments", p => p
.Description("Document attachments pipeline")
.Processors(pp => pp
.Foreach<ApplicationDto>(fe => fe
.Field(f => f.Attachments)
.Processor(fep => fep
.Attachment<Attachment>(a => a
.Field("_ingest._value._content")
.TargetField("_ingest._value.attachment")
)
)
).Foreach<ApplicationDto>(fe => fe
.Field(f => f.Attachments)
.Processor(fep => fep
.Remove<Attachment>(r => r
.Field("_ingest._value._content")
)
)
)
)
);
您的代码缺少 ForeachProcessor
; NEST 实现几乎是 Elasticsearch JSON 示例的直接翻译。 It's a little easier using the Attachment
type available in NEST too,将数据提取到的 attachment
对象将反序列化为该对象。
void Main()
{
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var defaultIndex = "default-index";
var connectionSettings = new ConnectionSettings(pool)
.DefaultIndex(defaultIndex);
var client = new ElasticClient(connectionSettings);
if (client.IndexExists(defaultIndex).Exists)
client.DeleteIndex(defaultIndex);
client.PutPipeline("attachments", p => p
.Processors(pp => pp
.Description("Document attachment pipeline")
.Foreach<Document>(fe => fe
.Field(f => f.Attachments)
.Processor(fep => fep
.Attachment<Attachment>(a => a
.Field("_ingest._value.data")
.TargetField("_ingest._value.attachment")
)
)
)
)
);
var indexResponse = client.Index(new Document
{
Attachments = new List<DocumentAttachment>
{
new DocumentAttachment { Data = "dGhpcyBpcwpqdXN0IHNvbWUgdGV4dAo=" },
new DocumentAttachment { Data = "VGhpcyBpcyBhIHRlc3QK" }
}
},
i => i.Pipeline("attachments")
);
var getResponse = client.Get<Document>(indexResponse.Id);
}
public class Document
{
public List<DocumentAttachment> Attachments { get; set; }
}
public class DocumentAttachment
{
public string Data { get; set; }
public Attachment Attachment { get; set; }
}
returns
{
"_index" : "default-index",
"_type" : "document",
"_id" : "AVrOVuC1vjcwkxZzCHYS",
"_version" : 1,
"found" : true,
"_source" : {
"attachments" : [
{
"data" : "dGhpcyBpcwpqdXN0IHNvbWUgdGV4dAo=",
"attachment" : {
"content_type" : "text/plain; charset=ISO-8859-1",
"language" : "en",
"content" : "this is\njust some text",
"content_length" : 24
}
},
{
"data" : "VGhpcyBpcyBhIHRlc3QK",
"attachment" : {
"content_type" : "text/plain; charset=ISO-8859-1",
"language" : "en",
"content" : "This is a test",
"content_length" : 16
}
}
]
}
}
您也可以链接 RemoveProcessor
以从 _source
中删除 data
字段。
问题描述
我想使用附件处理器并删除附件数组中的处理器。我知道为此目的需要 foreach 处理器。
这使得附加处理器和删除处理器能够在数组的各个元素上 运行 (https://www.elastic.co/guide/en/elasticsearch/plugins/current/ingest-attachment-with-arrays.html)
我找不到任何好的 NEST(c#) 示例来索引附件数组和删除内容字段。有人可以为我的用例提供 NEST(C#) 示例吗?
更新:感谢 Russ Cam,现在可以索引附件数组并使用以下管道删除 base64 编码的文件内容:
_client.PutPipeline("attachments", p => p
.Description("Document attachments pipeline")
.Processors(pp => pp
.Foreach<ApplicationDto>(fe => fe
.Field(f => f.Attachments)
.Processor(fep => fep
.Attachment<Attachment>(a => a
.Field("_ingest._value._content")
.TargetField("_ingest._value.attachment")
)
)
).Foreach<ApplicationDto>(fe => fe
.Field(f => f.Attachments)
.Processor(fep => fep
.Remove<Attachment>(r => r
.Field("_ingest._value._content")
)
)
)
)
);
您的代码缺少 ForeachProcessor
; NEST 实现几乎是 Elasticsearch JSON 示例的直接翻译。 It's a little easier using the Attachment
type available in NEST too,将数据提取到的 attachment
对象将反序列化为该对象。
void Main()
{
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var defaultIndex = "default-index";
var connectionSettings = new ConnectionSettings(pool)
.DefaultIndex(defaultIndex);
var client = new ElasticClient(connectionSettings);
if (client.IndexExists(defaultIndex).Exists)
client.DeleteIndex(defaultIndex);
client.PutPipeline("attachments", p => p
.Processors(pp => pp
.Description("Document attachment pipeline")
.Foreach<Document>(fe => fe
.Field(f => f.Attachments)
.Processor(fep => fep
.Attachment<Attachment>(a => a
.Field("_ingest._value.data")
.TargetField("_ingest._value.attachment")
)
)
)
)
);
var indexResponse = client.Index(new Document
{
Attachments = new List<DocumentAttachment>
{
new DocumentAttachment { Data = "dGhpcyBpcwpqdXN0IHNvbWUgdGV4dAo=" },
new DocumentAttachment { Data = "VGhpcyBpcyBhIHRlc3QK" }
}
},
i => i.Pipeline("attachments")
);
var getResponse = client.Get<Document>(indexResponse.Id);
}
public class Document
{
public List<DocumentAttachment> Attachments { get; set; }
}
public class DocumentAttachment
{
public string Data { get; set; }
public Attachment Attachment { get; set; }
}
returns
{
"_index" : "default-index",
"_type" : "document",
"_id" : "AVrOVuC1vjcwkxZzCHYS",
"_version" : 1,
"found" : true,
"_source" : {
"attachments" : [
{
"data" : "dGhpcyBpcwpqdXN0IHNvbWUgdGV4dAo=",
"attachment" : {
"content_type" : "text/plain; charset=ISO-8859-1",
"language" : "en",
"content" : "this is\njust some text",
"content_length" : 24
}
},
{
"data" : "VGhpcyBpcyBhIHRlc3QK",
"attachment" : {
"content_type" : "text/plain; charset=ISO-8859-1",
"language" : "en",
"content" : "This is a test",
"content_length" : 16
}
}
]
}
}
您也可以链接 RemoveProcessor
以从 _source
中删除 data
字段。