elasticsearch

Efficient way to retrieve all _ids in ElasticSearch


What is the fastest way to get all _ids of a certain index from ElasticSearch? Is it possible by using a simple query? One of my index has around 20,000 documents.


Solution

  • Edit: Please also read the answer from Aleck Landgraf

    You just want the elasticsearch-internal _id field? Or an id field from within your documents?

    For the former, try

    curl http://localhost:9200/index/type/_search?pretty=true -d '
    { 
        "query" : { 
            "match_all" : {} 
        },
        "stored_fields": []
    }
    '
    

    If you are using Elastic dev tools, use this instead:

    GET <your-index-name>/_search
    { 
        "query" : { 
            "match_all" : {} 
        },
        "stored_fields": []
    }
    

    Note 2017 Update: The post originally included "fields": [] but since then the name has changed and stored_fields is the new value.

    The result will contain only the "metadata" of your documents

    {
      "took" : 7,
      "timed_out" : false,
      "_shards" : {
        "total" : 5,
        "successful" : 5,
        "failed" : 0
      },
      "hits" : {
        "total" : 4,
        "max_score" : 1.0,
        "hits" : [ {
          "_index" : "index",
          "_type" : "type",
          "_id" : "36",
          "_score" : 1.0
        }, {
          "_index" : "index",
          "_type" : "type",
          "_id" : "38",
          "_score" : 1.0
        }, {
          "_index" : "index",
          "_type" : "type",
          "_id" : "39",
          "_score" : 1.0
        }, {
          "_index" : "index",
          "_type" : "type",
          "_id" : "34",
          "_score" : 1.0
        } ]
      }
    }
    

    For the latter, if you want to include a field from your document, simply add it to the fields array

    curl http://localhost:9200/index/type/_search?pretty=true -d '
    { 
        "query" : { 
            "match_all" : {} 
        },
        "fields": ["document_field_to_be_returned"]
    }
    '