Demo ứng dụng tìm kiếm tin tức sử dụng Elasticsearch, Spring Boot và MySQL.
- Java 17
- Spring Boot 3.2.1
- Elasticsearch 9.2.3
- MySQL 8.0
- Docker & Docker Compose
demo1/
├── compose.yml # Docker Compose config
├── pom.xml # Maven dependencies
├── src/
│ └── main/
│ ├── java/com/demo/news/
│ │ ├── NewsSearchApplication.java # Main application
│ │ ├── config/
│ │ │ └── ElasticsearchConfig.java # Elasticsearch configuration
│ │ ├── controller/
│ │ │ └── NewsController.java # REST endpoints
│ │ ├── dto/
│ │ │ ├── NewsDTO.java # Data transfer object
│ │ │ └── SearchRequest.java # Search request model
│ │ ├── document/
│ │ │ └── NewsDocument.java # Elasticsearch document
│ │ ├── entity/
│ │ │ └── NewsEntity.java # MySQL entity
│ │ ├── repository/
│ │ │ ├── elasticsearch/
│ │ │ │ └── NewsSearchRepository.java
│ │ │ └── mysql/
│ │ │ └── NewsRepository.java
│ │ └── service/
│ │ └── NewsService.java # Business logic
│ └── resources/
│ ├── application.yml # Application config
│ └── elasticsearch-settings.json # ES index settings
docker-compose up -dServices sẽ được khởi động:
- Elasticsearch: http://localhost:9200
- Kibana: http://localhost:5601
- MySQL: localhost:3306
mvn clean install
mvn spring-boot:runỨng dụng sẽ chạy tại: http://localhost:8080
POST http://localhost:8080/api/news
Content-Type: application/json
{
"title": "Tin tức về công nghệ AI",
"content": "Nội dung chi tiết về AI và machine learning...",
"author": "Nguyễn Văn A",
"category": "Technology",
"tags": "AI, Machine Learning, Tech",
"publishedDate": "2026-01-05T10:00:00"
}GET http://localhost:8080/api/newsGET http://localhost:8080/api/news/{id}PUT http://localhost:8080/api/news/{id}
Content-Type: application/json
{
"title": "Tiêu đề cập nhật",
"content": "Nội dung cập nhật...",
"author": "Tác giả",
"category": "Category",
"tags": "tags"
}DELETE http://localhost:8080/api/news/{id}POST http://localhost:8080/api/news/search
Content-Type: application/json
{
"keyword": "AI",
"category": "Technology",
"author": "Nguyễn Văn A",
"startDate": "2026-01-01T00:00:00",
"endDate": "2026-12-31T23:59:59",
"page": 0,
"size": 10
}Tham số tìm kiếm:
keyword: Tìm kiếm trong title và contentcategory: Lọc theo danh mụcauthor: Lọc theo tác giảstartDate: Lọc từ ngày (ISO format)endDate: Lọc đến ngày (ISO format)page: Số trang (mặc định: 0)size: Số lượng kết quả mỗi trang (mặc định: 10)
POST http://localhost:8080/api/news/sync✅ CRUD operations cho tin tức
✅ Tự động đồng bộ MySQL
✅ Full-text search với Elasticsearch
✅ Lọc theo category, author
✅ Lọc theo khoảng thời gian
✅ Phân trang kết quả tìm kiếm
curl http://localhost:9200/_cat/indices?vcurl -X GET "http://localhost:9200/news/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"title": "AI"
}
}
}
'Bảng news:
id(BIGINT, PRIMARY KEY, AUTO_INCREMENT)title(VARCHAR(500), NOT NULL)content(TEXT)author(VARCHAR(100))category(VARCHAR(100))tags(VARCHAR(500))published_date(DATETIME)created_at(DATETIME)updated_at(DATETIME)
- Đảm bảo Docker đang chạy trước khi khởi động services
- Chờ Elasticsearch khởi động hoàn toàn (~30s) trước khi chạy ứng dụng
- Database
news_dbsẽ tự động được tạo khi khởi động MySQL - Index
newstrong Elasticsearch sẽ tự động được tạo khi chạy ứng dụng
docker-compose downĐể xóa cả volumes (xóa dữ liệu):
docker-compose down -v