The goal of this project is to implement an application called product-app
. It consists of two Spring Boot
services: product-api
(backend) and product-ui
(frontend). The data will be stored in Elasticsearch
.
On ivangfr.github.io, I have compiled my Proof-of-Concepts (PoCs) and articles. You can easily search for the technology you are interested in by using the filter. Who knows, perhaps I have already implemented a PoC or written an article about what you are looking for.
-
product-api
Spring Boot
Web Java application that exposes a REST API to manages products. The information about products is stored inElasticsearch
.product-api
usesSpring Data Elasticsearch
to persist/query/delete data inElasticsearch
. -
product-ui
Spring Boot
Web application that was implemented usingThymeleaf
as HTML template. Also, it usesHttp Interfaces
to simplify HTTP remote access toproduct-api
.
-
Open a terminal and navigate to the
springboot-elasticsearch-thymeleaf
root folder run:docker compose up -d
-
Wait for
Elasticsearch
Docker container to be up and running. To check it, run:docker ps -a
Note
|
In the following steps, we will create an index, an alias and do a reindex using pre-defined scripts. In case you prefer to do it step-by-step calling Elasticsearch API, refer to Creating indexes, alias and reindexing using Elasticsearch API.
|
-
In a terminal, make sure you are in the
springboot-elasticsearch-thymeleaf
root folder; -
Run the following script to create the index
ecommerce.products.v1
with the aliasecommerce.products
(you can use the default values by just pressingEnter
on every user input):./create-index.sh
-
If you want to insert some products, run:
./insert-products.sh
-
If you want to fix the
reference
property mapping error (explained below), run:./reindex.sh
The script
./reindex.sh
is used to reindex an index to another. The default will reindex fromecommerce.products.v1
toecommerce.products.v2
. The only difference betweenelasticsearch/mapping-v1.json
(used byecommerce.products.v1
) toelasticsearch/mapping-v2.json
(used byecommerce.products.v2
) is thetype
of thereference
property. In the former, it is set the typetext
and, in the latter, the typekeyword
.It’s interesting because the
reference
property has some special characters. An example ofreference
code isSBES@DDR4-10000
. As it has the typetext
,Elasticsearch
(using thestandard
analyzer) splits the content in tokens ['SBES', 'DDR4', 10000]. So, for example, if you are looking for a product withDDR4
RAM and, for some reason, the stringDDR4
is present in the reference code of some product X, the product X will be selected, even if it doesn’t haveDDR4
in its description.So, the script
./reindex.sh
aims to fix it, setting the typekeyword
to thereference
property. TheDDR4
search issue won’t happen again because, from now on,Elasticsearch
won’t tokenize the content present in thereference
property.
Below are the steps to start and run the applications using Maven
. We will need to open a terminal for each one. Make sure you are in the springboot-elasticsearch-thymeleaf
root folder while running the commands.
-
product-api
./mvnw clean spring-boot:run --projects product-api
-
product-ui
./mvnw clean spring-boot:run --projects product-ui -Dspring-boot.run.jvmArguments="-Dserver.port=9080"
-
Build Docker Images
-
In a terminal, make sure you are in the
springboot-elasticsearch-thymeleaf
root folder; -
Run the following script:
./build-docker-images.sh
-
-
Environment Variables
-
product-api
Environment Variable Description ELASTICSEARCH_URIS
Specify uris of the
Elasticsearch
search engine to use (defaultlocalhost:9200
) -
product-ui
Environment Variable Description PRODUCT_API_URL
Specify url of the
product-api
service to use (defaulthttp://localhost:8080
)
-
-
Run Docker containers
-
In a terminal, make sure you are in the
springboot-elasticsearch-thymeleaf
root folder; -
Run the following script:
./start-apps.sh
-
Application | URL |
---|---|
product-api |
|
product-ui |
-
To stop applications:
-
If they were started with
Maven
, go toproduct-api
andproduct-ui
terminals and pressCtrl+C
; -
If they were started as Docker containers, go to a terminal and, inside the
springboot-elasticsearch-thymeleaf
root folder, run the script below:./stop-apps.sh
-
-
To stop and remove docker compose containers, network and volumes, go to a terminal and, inside the
springboot-elasticsearch-thymeleaf
root folder, run the following command:docker compose down -v