Search code examples
c#elasticsearchnestelasticsearch-net

Retrieve only internal _id with NEST ElasticClient


I try to execute a search with NEST ElasticClient and getting only the _id of the hits.

Here is my Code:

var client = new ElasticClient();
var searchResponse = client.Search<ElasticResult>(new SearchRequest {
         From = this.query.Page * 100,
         Size = 100,
         Source = new SourceFilter {
              Includes = "_id"
         },
         Query = new QueryStringQuery {
              Query = this.query.Querystring
         }
});

public class ElasticResult {
    public string _id;
}

But the _id of the Documents (ElasticResult-Objects) is always null. What am I doing wrong?


Solution

  • The _id is not part of the _source document, but part of the hit metadata for each hit in the hits array.

    The most compact way to return just the _id fields would be with using response filtering which is exposed as FilterPath in NEST

    private static void Main()
    {
        var defaultIndex = "documents";
        var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
    
        var settings = new ConnectionSettings(pool)
            .DefaultIndex(defaultIndex)
            .DefaultTypeName("_doc");
    
        var client = new ElasticClient(settings);
    
        if (client.IndexExists(defaultIndex).Exists)
            client.DeleteIndex(defaultIndex);
    
        client.Bulk(b => b
            .IndexMany<object>(new[] {
                new { Message = "hello" },
                new { Message = "world" }
            })
            .Refresh(Refresh.WaitFor)
        );
    
        var searchResponse = client.Search<object>(new SearchRequest<object>
        {
            From = 0 * 100,
            Size = 100,
            FilterPath = new [] { "hits.hits._id" },
            Query = new QueryStringQuery
            {
                Query = ""
            }
        });
    
        foreach(var id in searchResponse.Hits.Select(h => h.Id))
        {
            // do something with the ids
            Console.WriteLine(id);
        }
    }
    

    The JSON response from Elasticsearch to the search request looks like

    {
      "hits" : {
        "hits" : [
          {
            "_id" : "6gs8lmQB_8sm1yFaJDlq"
          },
          {
            "_id" : "6Qs8lmQB_8sm1yFaJDlq"
          }
        ]
      }
    }