Update index mapping
Update an index mapping
Endpoint - PUT /api/:target/_mapping
Update an index mapping
Request
e.g.
PUT http://localhost:4080/api/myindex/_mapping
Request Body:
{
"properties": {
"name": {
"type": "text",
"index": true,
"store": true,
"sortable": false,
"aggregatable": false,
"highlightable": true
},
"author": {
"type": "keyword",
"index": true,
"store": false,
"sortable": true,
"aggregatable": true,
"highlightable": false
},
"price": {
"type": "numeric",
"index": true,
"store": false,
"sortable": true,
"aggregatable": true,
"highlightable": false
},
"published": {
"type": "bool",
"index": true,
"store": false,
"sortable": true,
"aggregatable": true,
"highlightable": false
},
"create_at": {
"type": "date",
"format": "2006-01-02T15:04:05Z07:00",
"time_zone": "",
"index": true,
"store": false,
"sortable": true,
"aggregatable": true,
"highlightable": false
}
}
}
Mapping also can defines when create index.
Field types
| type | alias | description |
|---|---|---|
| text | - | default type, this type will analyze string to some tokens. |
| keyword | - | use entire string as one token, when query it's just a term. |
| bool | boolean | like keyword, but the value just true or false |
| numeric | integer, double, long, short, int, float | numberic type, it supports range query. |
| date | time, datetime | date type, it supports range query, and date aggregations. |
Field type parse rule
text
By default, all string value parse to text type, it can supports match and many queries.
And text type supports two params analyzer and search_analyzer.
analyzer and search_analyzer you should reference to https://zincsearch-docs.zinc.dev/api/index/analyze/
keyword
You should predeined this type.
Usually it use for some special values, it should has limit values, usually it not contians whitespace. like: the days of week, the seasons of year, a tag of something.
it can supports match query, term query, and terms aggregation.
bool
It's very simple, just use for boolean type. it will detected boolean value and set type to bool.
it can supports term query, and terms aggregation.
numeric
All numeric values of integer, double, long, short, int, float will detected and set type to numeric.
it can support term query, terms aggregation, range aggregation and all metrics aggregation, like min, max, avg, sum, count.
date
You should predeined this type. and date type supports param format and time_zone.
format:
date format you can reference to https://pkg.go.dev/time#pkg-constants
Default date format is: 2006-01-02T15:04:05Z07:00, refers to time.RFC3339.
You can set other format what golang support.
Also you can use timestamp for date field, set format to: epoch_millis.
time_zone:
Default value is UTC, you can set it like: +08:00 or -01:00.
Field attributes
All field support 5 attributes:
index
Enable index for the field, default is true, it will can't be query if it disabled.
store
Store value for the field, default is false, it can returns the origin value when query, it used for like highlight.
sortable
Enable sort support for the field, default is false, but it default enabled for numeric and date type.
aggregatable
Enable aggregation for the field, default is false, but it default enabled for numeric and date type.
highlightable
Enable highlight for the field, default is false, if you want use highlight for the field, you should enable it.
Custom @Timestamp field
You can custom `@timestamp`` field in mapping, this allow use your own timestamp.
Default:
{
"properties": {
"@timestamp": {
"type": "date",
"format": "2006-01-02T15:04:05Z07:00",
"time_zone": "00:00",
"index": true,
"store": false,
"sortable": true,
"aggregatable": true,
"highlightable": false
}
}
}
Or use custom format and time_zone:
{
"properties": {
"@timestamp": {
"type": "date",
"format": "2006-01-02 15:04:05",
"time_zone": "+08:00",
"index": true,
"store": false,
"sortable": true,
"aggregatable": true,
"highlightable": false
}
}
}
Or use epoch_millis:
{
"properties": {
"@timestamp": {
"type": "date",
"format": "epoch_millis",
"time_zone": "+08:00",
"index": true,
"store": false,
"sortable": true,
"aggregatable": true,
"highlightable": false
}
}
}
If use
epoch_millisthe value of@timestampshould be a numeric of timestamp.
Actually @timestamp is a date field, just named @timestamp.
After defined with mapping, you can use your own time format value for @timestamp field.
Just add the field in you document, like this:
e.g. POST http://localhost:4080/api/myindex/_doc
Request Body:
Or use bulk API:
e.g. POST /api/_bulk