> ## Documentation Index
> Fetch the complete documentation index at: https://docs.recruitier.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Job Search Overview

> Search thousands of jobs across the Netherlands with AI-powered semantic search.

## What Makes Recruitier's Job Search Different

Most recruitment platforms rely on simple keyword matching. You type "Python developer" and
only see listings that contain those exact words. Recruitier takes a fundamentally different
approach by combining **semantic understanding** with **keyword matching** to deliver results
that truly match what you are looking for.

When you search for "Python developer," Recruitier does not just look for those words. It
understands that this role involves backend engineering, scripting, frameworks like Django
and FastAPI, database experience, and related competencies. This means you also see relevant
listings titled "Backend Engineer," "Software Developer," or "Data Engineer" -- jobs that
a traditional keyword search would miss entirely.

<Tip>
  Semantic search understands the **meaning** behind your query, not just the words. This
  is why a search for "Frontend Developer" also surfaces jobs titled "UI Engineer" or
  "React Developer" -- they describe the same role using different terminology.
</Tip>

## Three Search Modes

Recruitier offers three distinct search modes, each suited to different use cases. The
default mode is **Hybrid**, which gives you the best of both worlds.

| Mode                 | Description                                                                                                                                   | Best For                                                                                                                |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| **Hybrid** (Default) | Combines semantic understanding with keyword precision using Reciprocal Rank Fusion (RRF). Results are scored across both engines and merged. | General-purpose searching where you want both meaning-based and exact-term matching.                                    |
| **Semantic Only**    | Uses vector embeddings exclusively. Finds jobs based purely on meaning similarity.                                                            | Exploratory searches where you want to discover roles described with different terminology.                             |
| **Keyword Only**     | Uses BM25 text matching exclusively. Finds jobs that contain your exact search terms.                                                         | Precision searches where you know the exact terms employers use, such as specific certifications or niche technologies. |

<Note>
  The Hybrid mode is recommended for the vast majority of searches. It ensures you do not
  miss semantically relevant jobs while still rewarding exact keyword matches with a scoring
  bonus. Switch to Semantic Only or Keyword Only when you have a specific reason to do so.
</Note>

## How Jobs Are Sourced

Recruitier continuously scrapes job listings directly from company career pages across the
Netherlands. Unlike job boards that rely on employers to manually post listings, Recruitier
proactively discovers jobs at their source. This means you often find opportunities before
they appear on mainstream platforms.

The scraping pipeline works around the clock:

1. **Discovery** -- Recruitier's scrapers visit thousands of Dutch company websites and
   career pages to identify new job postings.
2. **Extraction** -- Each listing is parsed to extract structured data: job title, location,
   experience level, job type, flexibility options, salary information, and the full job
   description.
3. **Enrichment** -- The platform links each job to its parent company record, pulling in
   company details like industry, employee count, LinkedIn profile, and website.
4. **Indexing** -- Jobs are converted into vector embeddings and indexed for both semantic
   and keyword search, making them instantly searchable.

<Note>
  Recruitier refreshes its job data continuously. New listings are typically indexed within
  hours of being published on a company's career page. Jobs that are no longer available are
  automatically marked as expired.
</Note>

## The Search Database

The Recruitier search database contains tens of thousands of active job listings from Dutch
companies. Each listing includes:

* **Job title** and full description (with markdown formatting)
* **Location** with geocoded coordinates for radius-based filtering
* **Experience level** (junior, medior, senior, lead)
* **Job type** (full-time, part-time, contract, temporary, internship)
* **Flexibility** (remote, hybrid, on-site)
* **Salary range** when available
* **Company information** including name, industry, employee count, and LinkedIn profile
* **Posting date** for recency filtering (detected from multiple sources: JSON-LD structured
  data, LLM extraction, HTML metadata, visible text patterns, URL patterns, sitemaps, or
  the date Recruitier first discovered the listing)
* **Requirements summary** extracted by AI
* **Contact information** including emails, phone numbers, and LinkedIn profiles of decision
  makers
* **"Geen acquisitie" detection** -- a flag indicating the company does not want recruiter
  outreach

This rich structured data powers both the search filters and the AI-powered ranking that
makes Recruitier's results so precise.

## The Search Workflow

Using Recruitier's job search follows a clear, guided workflow:

<Steps>
  <Step title="Create a Search">
    Use the 4-step search wizard to define what you are looking for. Enter a job title,
    review AI-extracted skills, set your filters, and configure preferences like salary
    range and company size.
  </Step>

  <Step title="Review Results">
    Recruitier processes your search asynchronously and presents a ranked list of matching
    jobs. Each result includes a relevance score, job details, and company information.
    Sort, filter, and explore the results to find the best opportunities.
  </Step>

  <Step title="Save and Organize">
    Save the most promising jobs to your collection. Apply tags, add internal notes, and
    track your outreach progress. Your saved searches are stored for easy access later.
  </Step>

  <Step title="Monitor for New Matches">
    Saved searches are automatically monitored. When new jobs matching your criteria are
    posted, Recruitier notifies you and adds them to your search results so you never miss
    an opportunity.
  </Step>
</Steps>

## Search vs. Saved Jobs

It is important to understand the distinction between **searches** and **saved jobs** in
Recruitier:

| Concept        | Description                                                                                                                                                                                          |
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Search**     | A set of criteria (job title, skills, filters) that you define. Recruitier runs this against the database and returns ranked results. Searches can be re-run, cloned, and monitored for new matches. |
| **Saved Jobs** | Individual job listings that you have collected from search results or client pages. These live in your Jobs collection where you can tag, annotate, and track them.                                 |

A single search can produce hundreds of results. You then selectively save the ones worth
pursuing into your Jobs collection for further action.

## Boolean Search Support

Recruitier supports boolean operators in the job title field to help you cast a wider net
for roles that could be described with different titles.

**How it works:**

* Use `or` between terms to search for multiple variations: `"python developer or backend engineer"`
* Each combination generates a separate search query to the recommendation engine
* Results from all queries are merged and deduplicated, so you never see the same job twice
* The final result set contains the best matches from all query variations

<Tip>
  Boolean search with `or` is particularly useful for roles that go by multiple names.
  For example, `"data engineer or data platform engineer or analytics engineer"` captures
  all common titles for this type of role in a single search.
</Tip>

## Search Sources

Every search has a **source** that indicates where it originated. This helps you track
how your searches were created:

| Source             | Description                                                                 |
| ------------------ | --------------------------------------------------------------------------- |
| **Recommendation** | Created through the standard search wizard using the recommendation engine. |
| **LinkedIn**       | Created from LinkedIn job data or candidate profile matching.               |
| **Indeed**         | Created from Indeed job data.                                               |

The source is displayed on the search card in your saved searches list and on the search
detail page.

<CardGroup cols={2}>
  <Card title="Create Your First Search" icon="magnifying-glass" href="/jobs/search/creating-a-search">
    Follow the 4-step wizard to create a targeted job search.
  </Card>

  <Card title="How Search Technology Works" icon="microchip" href="/jobs/search/how-search-works">
    Learn about the hybrid semantic and keyword engine behind the results.
  </Card>
</CardGroup>

## Key Features at a Glance

<CardGroup cols={2}>
  <Card title="AI Skill Extraction" icon="sparkles">
    Enter a job title and AI automatically identifies the relevant skills, technologies,
    and competencies to improve your search accuracy.
  </Card>

  <Card title="Hybrid Search Engine" icon="brain">
    Combines vector-based semantic search with BM25 keyword matching for results that
    balance meaning and precision.
  </Card>

  <Card title="Real-Time Processing" icon="bolt">
    Searches are processed asynchronously with live status updates so you always know
    what stage your search is in.
  </Card>

  <Card title="Monitored Searches" icon="bell">
    Your searches are continuously monitored. New jobs matching your criteria are flagged
    automatically, keeping your pipeline fresh.
  </Card>
</CardGroup>

## Advanced

### Search Entity Architecture

Under the hood, each search you create is stored as a **search entity** with a comprehensive
set of fields that drive the entire search pipeline:

* **Core identifiers**: name, description, and extra\_keywords that define what you are
  looking for
* **Filter arrays**: experience\_level, job\_type, flexibility, and "when" (recency) are
  stored as JSONB arrays, allowing multi-select for each filter dimension
* **Location data**: city name, latitude, longitude, and radius\_km for geocoded radius
  filtering
* **Source tracking**: whether the search originated from LinkedIn, Indeed, or the
  recommendation engine
* **Boolean type**: AND or OR logic for combining search terms
* **AI search flag**: marks whether AI-enhanced search features were used
* **Monitoring state**: is\_monitored tracks whether the search watches for new jobs, and
  new\_jobs\_count tracks how many unreviewed matches have been found
* **Candidate linking**: candidate\_id connects a search to a specific candidate profile
  for CV-based matching
* **Pagination**: pages controls how many pages of results to retrieve from the
  recommendation engine

### How Search Connects to Other Features

The search system is the entry point to several downstream features:

1. **Job collection** -- Search results populate your personal job collection. Each result
   becomes a Job entity linked to both the search and the underlying ScrapedJob record.
2. **Contact discovery** -- When results are returned, Recruitier enriches each job with
   contact information from the parent company, enabling outreach directly from search
   results.
3. **Candidate matching** -- Searches can be linked to a candidate profile. When a
   candidate\_id is present, the search criteria are tailored to that candidate's skills
   and experience, and results are presented in the context of that candidate's profile.
4. **Monitoring pipeline** -- Monitored searches feed into a background job that
   periodically re-runs the search criteria against newly indexed jobs, delivering
   real-time notifications via SSE (Server-Sent Events) when new matches are found.
5. **Cloning and collaboration** -- The search entity supports cloning to other users
   within the same agency, copying all jobs, contacts, and metadata.

### Power-User Tips

<Accordion title="Get more results with broader queries">
  If your initial search returns fewer results than expected, try these approaches:

  * Use boolean OR to include alternative job titles
  * Reduce the number of confirmed skills to the 3-4 most essential ones
  * Widen the location radius or remove the location filter entirely
  * Expand the "posted within" timeframe to 6 months or anytime
  * Select multiple experience levels (e.g., both medior and senior)
</Accordion>

<Accordion title="Narrow results without re-searching">
  You do not need to create a new search to refine results. Use the in-results filters
  on the search detail page to narrow by experience level, job type, flexibility, match
  type, tags, and active status. This is faster than re-running the search and preserves
  your original result set.
</Accordion>

<Accordion title="Use search monitoring strategically">
  Monitoring works best for stable, well-defined searches. If your search criteria are
  very broad (e.g., just "Developer" with no filters), the monitor will find many new
  matches and the new\_jobs\_count can grow quickly. For effective monitoring, use specific
  job titles and at least 2-3 filters to keep the match stream focused and actionable.
</Accordion>

### Business Logic Rules

* **Score normalization**: All match scores are displayed on a 30-99% scale. The top result
  in any search is normalized to approximately 99%, with all other results scaled relative
  to the top score. This means scores are meaningful within a single search but should not
  be compared across different searches.
* **Poor match removal**: Jobs classified as "Poor Match" (matching less than 80% of
  keywords) can be automatically removed to keep your results focused on quality
  opportunities.
* **Deduplication**: When using boolean OR queries, each combination generates a separate
  API call. Results are merged and deduplicated by the underlying ScrapedJob ID, so you
  never see duplicate listings.
* **Search state progression**: Each search moves through states (Searching > Classifying >
  Retrieving Company Info > Done) and cannot skip steps. Real-time progress is delivered
  via SSE notifications.

## Related

* [Creating a Search](/jobs/search/creating-a-search) -- Step-by-step guide to the search wizard
* [How Search Technology Works](/jobs/search/how-search-works) -- Deep dive into the hybrid engine
* [Search Filters](/jobs/search/search-filters) -- Complete filter reference
* [Search Results](/jobs/search/search-results) -- Navigating and acting on your results
