_index field

When performing queries across multiple indexes, it is sometimes desirable to add query clauses that are associated with documents of only certain indexes. The _index field allows matching on the index a document was indexed into. Its value is accessible in certain queries and aggregations, and when sorting or scripting:

  1. PUT index_1/_doc/1
  2. {
  3. "text": "Document in index 1"
  4. }
  5. PUT index_2/_doc/2?refresh=true
  6. {
  7. "text": "Document in index 2"
  8. }
  9. GET index_1,index_2/_search
  10. {
  11. "query": {
  12. "terms": {
  13. "_index": ["index_1", "index_2"]
  14. }
  15. },
  16. "aggs": {
  17. "indices": {
  18. "terms": {
  19. "field": "_index",
  20. "size": 10
  21. }
  22. }
  23. },
  24. "sort": [
  25. {
  26. "_index": {
  27. "order": "asc"
  28. }
  29. }
  30. ],
  31. "script_fields": {
  32. "index_name": {
  33. "script": {
  34. "lang": "painless",
  35. "source": "doc['_index']"
  36. }
  37. }
  38. }
  39. }

Querying on the _index field

Aggregating on the _index field

Sorting on the _index field

Accessing the _index field in scripts

The _index field is exposed virtually — it is not added to the Lucene index as a real field. This means that you can use the _index field in a term or terms query (or any query that is rewritten to a term query, such as the match, query_string or simple_query_string query), as well as prefix and wildcard queries. However, it does not support regexp and fuzzy queries.

Queries on the _index field accept index aliases in addition to concrete index names.

When specifying a remote index name such as cluster_1:index_3, the query must contain the separator character :. For example, a wildcard query on cluster_*:index_3 would match documents from the remote index. However, a query on cluster*index_1 is only matched against local indices, since no separator is present. This behavior aligns with the usual resolution rules for remote index names.