如何使用附件处理器并删除NEST客户端附件阵列中的处理器?

时间:2017-03-14 12:40:57

标签: elasticsearch nest

问题描述

我想使用附件处理器并删除附件数组中的处理器。我知道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")
                        )
                    )
                )
            )
        );

1 个答案:

答案 0 :(得分:3)

您的代码缺少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; }
}

返回

{
  "_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以从data删除_source字段。