In the following steps, we are going to manually create an index called ecommerce.products.v1
using the Elasticsearch
API, associate an alias called ecommerce.products
with it, and then reindex to another index called ecommerce.products.v2
.
Make sure your Elasticsearch
instance is clean and does not contain the previously mentioned indexes or alias. Also, the following curl
commands must be executed in springboot-elasticsearch-thymeleaf
root folder.
-
Check
Elasticsearch
is up and runningcurl localhost:9200
It should return something similar to:
{ "name" : "99fdd70d5915", "cluster_name" : "docker-cluster", "cluster_uuid" : "1HUDp8N3SF2WLtzZYOGgxA", "version" : { "number" : "8.5.3", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "4ed5ee9afac63de92ec98f404ccbed7d3ba9584e", "build_date" : "2022-12-05T18:22:22.226119656Z", "build_snapshot" : false, "lucene_version" : "9.4.2", "minimum_wire_compatibility_version" : "7.17.0", "minimum_index_compatibility_version" : "7.0.0" }, "tagline" : "You Know, for Search" }
-
Create
ecommerce.products.v1
indexcurl -X PUT localhost:9200/ecommerce.products.v1 -H "Content-Type: application/json" -d @elasticsearch/mapping-v1.json
It should return:
{"acknowledged":true,"shards_acknowledged":true,"index":"ecommerce.products.v1"}
-
Check indexes
curl "localhost:9200/_cat/indices?v"
It should return something like:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size yellow open ecommerce.products.v1 qgIIfyD1TUCN2s0wiDlmzA 1 1 0 0 225b 225b
-
Check
ecommerce.products.v1
index mappingcurl "localhost:9200/ecommerce.products.v1/_mapping?pretty"
It should return:
{ "ecommerce.products.v1" : { "mappings" : { "properties" : { "categories" : { "type" : "keyword" }, "created" : { "type" : "date", "format" : "strict_date_time_no_millis||yyyy-MM-dd'T'HH:mmZZ" }, "description" : { "type" : "text", "analyzer" : "my_analyzer", "search_analyzer" : "my_search_analyzer" }, "name" : { "type" : "text", "analyzer" : "my_analyzer", "search_analyzer" : "my_search_analyzer" }, "price" : { "type" : "float" }, "reference" : { "type" : "text" }, "reviews" : { "properties" : { "comment" : { "type" : "text" }, "created" : { "type" : "date", "format" : "strict_date_time_no_millis||yyyy-MM-dd'T'HH:mmZZ" }, "stars" : { "type" : "short" } } } } } } }
-
Create alias for
ecommerce.products.v1
indexcurl -X POST localhost:9200/_aliases -H 'Content-Type: application/json' \ -d '{ "actions": [{ "add": {"alias": "ecommerce.products", "index": "ecommerce.products.v1" }}]}'
It should return:
{"acknowledged":true}
-
Check aliases
curl "localhost:9200/_aliases?pretty"
It should return:
{ "ecommerce.products.v1" : { "aliases" : { "ecommerce.products" : { } } } }
-
Create
ecommerce.products.v2
indexcurl -X PUT localhost:9200/ecommerce.products.v2 -H "Content-Type: application/json" -d @elasticsearch/mapping-v2.json
It should return:
{"acknowledged":true,"shards_acknowledged":true,"index":"ecommerce.products.v2"}
Check the indexes again
curl "localhost:9200/_cat/indices?v"
It should return something like:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size yellow open ecommerce.products.v2 pGzs5rfCR32aBVukwmEu6Q 1 1 0 0 225b 225b yellow open ecommerce.products.v1 qgIIfyD1TUCN2s0wiDlmzA 1 1 0 0 225b 225b
-
Reindex from
ecommerce.products.v1
toecommerce.products.v2
curl -X POST localhost:9200/_reindex -H 'Content-Type: application/json' \ -d '{ "source": { "index": "ecommerce.products.v1" }, "dest": { "index": "ecommerce.products.v2" }}'
It should return something like:
{"took":13,"timed_out":false,"total":0,"updated":0,"created":0,"deleted":0,"batches":0,"version_conflicts":0,"noops":0,"retries":{"bulk":0,"search":0},"throttled_millis":0,"requests_per_second":-1.0,"throttled_until_millis":0,"failures":[]}
-
Adjust the alias after reindexing from
ecommerce.products.v1
toecommerce.products.v2
curl -X POST localhost:9200/_aliases -H 'Content-Type: application/json' \ -d '{ "actions": [{ "remove": {"alias": "ecommerce.products", "index": "ecommerce.products.v1" }}, { "add": {"alias": "ecommerce.products", "index": "ecommerce.products.v2" }}]}'
It should return:
{"acknowledged":true}
Check the aliases again
curl "localhost:9200/_aliases?pretty"
It should return something like:
{ "ecommerce.products.v2" : { "aliases" : { "ecommerce.products" : { } } }, "ecommerce.products.v1" : { "aliases" : { } } }
-
Delete
ecommerce.products.v1
indexcurl -X DELETE localhost:9200/ecommerce.products.v1
It should return:
{"acknowledged":true}
Check the aliases again
curl "localhost:9200/_aliases?pretty"
It should return:
{ "ecommerce.products.v2" : { "aliases" : { "ecommerce.products" : { } } } }
-
Simple search
curl "localhost:9200/ecommerce.products/_search?pretty"
It should return something like:
{ "took" : 5, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 0, "relation" : "eq" }, "max_score" : null, "hits" : [ ] } }
Since there are no products, the
hits
array field is empty.