Update blog attachment code example

Russ,
I am hoping you can help me get the code working from the following blog post:

It is written using a previous version of NEST, but the Attachment method seems to have been deprecated and will not work with NEST 7.1 version.

Thanks,

Karl

Hey @futureshock2038, the latter part of the blog post is still relevant, although the API methods have been reorganized into "namespaced" properties, to make them more discoverable and to match the naming convention used in the REST API specs. For example,

  • client.CreateIndex(...) becomes client.Indices.Create()
  • client.PutPipeline() becomes client.Ingest.PutPipeline()

Here's a working example with NEST 7.1.0 against Elasticsearch 7.3.0, using the example_one.docx file from this gist

private static void Main()
{
    var defaultIndex = "attachments";
    var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));

    var settings = new ConnectionSettings(pool)
        .DefaultIndex(defaultIndex)
        .DisableDirectStreaming()
        .PrettyJson()
        .OnRequestCompleted(callDetails =>
        {
            if (callDetails.RequestBodyInBytes != null)
            {
                Console.WriteLine(
                    $"{callDetails.HttpMethod} {callDetails.Uri} \n" +
                    $"{Encoding.UTF8.GetString(callDetails.RequestBodyInBytes)}");
            }
            else
            {
                Console.WriteLine($"{callDetails.HttpMethod} {callDetails.Uri}");
            }

            Console.WriteLine();

            if (callDetails.ResponseBodyInBytes != null)
            {
                Console.WriteLine($"Status: {callDetails.HttpStatusCode}\n" +
                         $"{Encoding.UTF8.GetString(callDetails.ResponseBodyInBytes)}\n" +
                         $"{new string('-', 30)}\n");
            }
            else
            {
                Console.WriteLine($"Status: {callDetails.HttpStatusCode}\n" +
                         $"{new string('-', 30)}\n");
            }
        });

    var client = new ElasticClient(settings);

	if (client.Indices.Exists(defaultIndex).Exists)
	{
		var deleteIndexResponse = client.Indices.Delete(defaultIndex);
	}

    var createIndexResponse = client.Indices.Create(defaultIndex, c => c
        .Settings(s => s
            .Analysis(a => a
                .Analyzers(ad => ad
                    .Custom("windows_path_hierarchy_analyzer", ca => ca
                        .Tokenizer("windows_path_hierarchy_tokenizer")
                    )
                )
                .Tokenizers(t => t
                    .PathHierarchy("windows_path_hierarchy_tokenizer", ph => ph
                        .Delimiter('\\')
                    )
                )
            )
        )
        .Map<Document>(mp => mp
            .AutoMap()
            .Properties(ps => ps
                .Text(s => s
                    .Name(n => n.Path)
                    .Analyzer("windows_path_hierarchy_analyzer")
                )
                .Object<Attachment>(a => a
                    .Name(n => n.Attachment)
                    .AutoMap()
                )
            )
        )
    );

	var putPipelineResponse = client.Ingest.PutPipeline("attachments", p => p
		.Description("Document attachment pipeline")
		.Processors(pr => pr
			.Attachment<Document>(a => a
				.Field(f => f.Content)
				.TargetField(f => f.Attachment)
			)
			.Remove<Document>(r => r
				.Field(ff => ff
					.Field(f => f.Content)
				)
			)
		)
	);

	var base64File = Convert.ToBase64String(File.ReadAllBytes(@"C:\example_one.docx"));
	
	var indexResponse = client.Index(new Document
	{
		Id = 1,
		Path = @"\\share\documents\examples\example_one.docx",
		Content = base64File
	}, i => i
		.Pipeline("attachments")
		.Refresh(Refresh.WaitFor)
	);

	var searchResponse = client.Search<Document>(s => s
	  .Query(q => q
		.Match(m => m
		  .Field(a => a.Attachment.Content)
		  .Query("NEST")
		)
	  )
	);
	
	foreach(var hit in searchResponse.Hits)
	{
		var attachment = hit.Source.Attachment;
		Console.WriteLine($"Attachment details for doc id {hit.Id}");
		Console.WriteLine($"date: {attachment.Date}");
		Console.WriteLine($"content type: {attachment.ContentType}");
		Console.WriteLine($"author: {attachment.Author}");
		Console.WriteLine($"language: {attachment.Language}");
		Console.WriteLine($"content: {attachment.Content}");
		Console.WriteLine($"content length: {attachment.ContentLength}");
	}
}

public class Document
{
    public int Id { get; set; }
    public string Path { get; set; }
    public string Content { get; set; }
    public Attachment Attachment { get; set; }
}

This prints out

Attachment details for doc id 1
date: 30/08/2016 5:48:00 AM
content type: application/vnd.openxmlformats-officedocument.wordprocessingml.document
author: Russ Cam
language: en
content: The Present and Future of Attachments

This is a sample document to demonstrate indexing attachments using NEST and the new Attachment type
content length: 141