index_prefixes

edit

The index_prefixes parameter enables the indexing of term prefixes to speed up prefix searches. It accepts the following optional settings:

min_chars

The minimum prefix length to index. Must be greater than 0, and defaults to 2. The value is inclusive.

max_chars

The maximum prefix length to index. Must be less than 20, and defaults to 5. The value is inclusive.

This example creates a text field using the default prefix length settings:

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "properties": {
            "body_text": {
                "type": "text",
                "index_prefixes": {}
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        body_text: {
          type: 'text',
          index_prefixes: {}
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    properties: {
      body_text: {
        type: "text",
        index_prefixes: {},
      },
    },
  },
});
console.log(response);
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "body_text": {
        "type": "text",
        "index_prefixes": { }    
      }
    }
  }
}

An empty settings object will use the default min_chars and max_chars settings

This example uses custom prefix length settings:

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "properties": {
            "full_name": {
                "type": "text",
                "index_prefixes": {
                    "min_chars": 1,
                    "max_chars": 10
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        full_name: {
          type: 'text',
          index_prefixes: {
            min_chars: 1,
            max_chars: 10
          }
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    properties: {
      full_name: {
        type: "text",
        index_prefixes: {
          min_chars: 1,
          max_chars: 10,
        },
      },
    },
  },
});
console.log(response);
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "full_name": {
        "type": "text",
        "index_prefixes": {
          "min_chars" : 1,
          "max_chars" : 10
        }
      }
    }
  }
}

index_prefixes parameter instructs Elasticsearch to create a subfield "._index_prefix". This field will be used to do fast prefix queries. When doing highlighting, add "._index_prefix" subfield to the matched_fields parameter to highlight the main field based on the found matches of the prefix field, like in the request below:

resp = client.search(
    index="my-index-000001",
    query={
        "prefix": {
            "full_name": {
                "value": "ki"
            }
        }
    },
    highlight={
        "fields": {
            "full_name": {
                "matched_fields": [
                    "full_name._index_prefix"
                ]
            }
        }
    },
)
print(resp)
GET my-index-000001/_search
{
  "query": {
    "prefix": {
      "full_name": {
        "value": "ki"
      }
    }
  },
  "highlight": {
    "fields": {
      "full_name": {
        "matched_fields": ["full_name._index_prefix"]
      }
    }
  }
}