- Repository:
Rajkumar-Sony/Job-Search-Portal - URL:
https://github.com/Rajkumar-Sony/Job-Search-Portal - Default branch:
main - Clone:
git clone https://github.com/Rajkumar-Sony/Job-Search-Portal.git
cd Job-Search-Portal- Push setup:
git remote add origin https://github.com/Rajkumar-Sony/Job-Search-Portal.git
git branch -M main
git push -u origin main- Issue tracker:
https://github.com/Rajkumar-Sony/Job-Search-Portal/issues - Pull requests:
https://github.com/Rajkumar-Sony/Job-Search-Portal/pulls
Elasticsearch is a distributed search engine optimized for:
- Full-text search
- Fast filtering
- Relevance ranking
- Typo-tolerant search (fuzzy)
- Aggregations for analytics
In this project, Elasticsearch is used for jobs search data (title, company, description, skills, location, experience, salary, posted date).
Add Spring Data Elasticsearch starter in pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>Configure Elasticsearch connection in src/main/resources/application.yaml:
spring:
elasticsearch:
uris: http://localhost:9200Create Elasticsearch repository interface:
public interface JobRepository extends ElasticsearchRepository<JobDocument, String> {
List<JobDocument> findByTitleContainingIgnoreCaseOrCompanyContainingIgnoreCaseOrDescriptionContainingIgnoreCase(
String title, String company, String description
);
}- Create jobs (stored in Elasticsearch)
- Search jobs by keyword
- Filter jobs by location, skill, and minimum experience
- View job details by id
- Create job applications (stored in MySQL)
- List applications by job id
- DTO-based API contracts (
*Request,*Response) - Custom mapper layer (no ModelMapper dependency)
- React + Vite + Tailwind frontend
SpringBoot-ElasticSearch-ReactJs/
├── src/main/java/com/learn/app
│ ├── JobSearchPortalApplication.java
│ ├── config/WebConfig.java
│ ├── controller/
│ │ ├── JobController.java
│ │ └── JobApplicationController.java
│ ├── dto/
│ │ ├── job/
│ │ │ ├── JobCreateRequest.java
│ │ │ └── JobResponse.java
│ │ └── application/
│ │ ├── JobApplicationCreateRequest.java
│ │ └── JobApplicationResponse.java
│ ├── mapper/
│ │ ├── JobMapper.java
│ │ ├── JobApplicationMapper.java
│ │ └── impl/
│ │ ├── JobMapperImpl.java
│ │ └── JobApplicationMapperImpl.java
│ ├── model/
│ │ ├── JobDocument.java
│ │ └── JobApplication.java
│ ├── repository/
│ │ ├── JobRepository.java
│ │ └── JobApplicationRepository.java
│ └── service/
│ ├── JobService.java
│ ├── JobApplicationService.java
│ └── impl/
│ ├── JobServiceImpl.java
│ └── JobApplicationServiceImpl.java
├── src/main/resources/application.yaml
├── src/test/java/com/learn/app/JobSearchPortalApplicationTests.java
├── Dockerfile
├── docker-compose.yml
├── rest.http
└── frontend/
├── Dockerfile
├── index.html
├── nginx.conf
├── package-lock.json
├── package.json
├── postcss.config.cjs
├── tailwind.config.cjs
├── vite.config.js
└── src/
├── main.jsx
├── App.jsx
├── styles.css
├── constants/
│ ├── formDefaults.js
│ └── uiClasses.js
├── services/
│ └── jobApi.js
└── components/
├── jobs/
│ ├── AddJobForm.jsx
│ ├── JobList.jsx
│ └── JobSearchForm.jsx
└── applications/
└── ApplicationForm.jsx
- Backend app name:
job-search-portal - Backend port:
8080 - Frontend dev port:
5173 - Elasticsearch:
9200 - MySQL:
3306 - MySQL database:
job_portal
Main backend config file: src/main/resources/application.yaml
JobRepositoryextendsElasticsearchRepository<JobDocument, String>JobApplicationRepositoryextendsJpaRepository<JobApplication, Long>- Repository pattern is used via service interfaces + implementations.
- Java 17+
- Node.js 18+ / npm
- Docker + Docker Compose
docker compose up -d --buildAccess:
- Frontend:
http://localhost:5173 - Backend:
http://localhost:8080 - Elasticsearch:
http://localhost:9200 - MySQL:
localhost:3306
# backend
./mvnw spring-boot:run# frontend
cd frontend
npm install
npm run devUse a Docker-friendly platform (Railway, Render, Fly.io, VPS, Oracle VM):
docker compose up -d --buildor deploy services individually (backend, frontend, mysql, elasticsearch) using Dockerfiles.
- Deploy
frontend/to Vercel - Deploy backend (Spring Boot) + MySQL + Elasticsearch on another platform
- Set frontend env variable:
VITE_API_BASE=https://your-backend-domain/api- Start infrastructure (
docker compose up -d --build) or run services manually. - Open frontend at
http://localhost:5173. - Create a job from UI (
Add Jobform) or userest.http. - Search/filter jobs from
Search Jobs. - Select a job and submit application from
Apply. - Verify APIs:
POST /api/jobsGET /api/jobsGET /api/jobs/{id}GET /api/jobs/search?q=&location=&skill=&minExperience=POST /api/applicationsGET /api/applications?jobId=...
You can use rest.http for quick API testing.
This project is proprietary and closed-source. No one is allowed to copy, use, modify, or redistribute this code without written permission. See LICENSE.
All rights reserved. Happy coding!
Build with ❤️ by Raj Kumar Sony. For more information, visit https://rajkumarsony.vercel.app.