> ## 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.

# Search Filters

> Refine your job search with location, experience, job type, and flexibility filters.

## Overview

Recruitier's search filters let you narrow down your job search to precisely match what
you or your candidates are looking for. Filters are applied during the search wizard
(Steps 3 and 4) and work alongside the job title and AI-extracted skills to produce
focused, relevant results.

Filters are divided into two categories: **company preferences** (Step 3) and
**job characteristics** (Step 4). Both are optional -- you can run a search with just
a job title and skills if you prefer a broad set of results.

<Info>
  Filters are applied server-side during the search process. They reduce the number of
  results returned, which also speeds up processing time. If you are getting too few
  results, try relaxing one or two filters.
</Info>

<Note>
  Filters are processed at different stages of the search pipeline for optimal performance.
  Some filters (like company name, experience level, and flexibility) are applied directly
  in the vector database for speed. Others (like salary range and company size) are applied
  as post-filters on the initial results. This is transparent to you as a user -- all
  filters appear equally in the wizard -- but it explains why some filter combinations
  return results faster than others.
</Note>

## Location

The location filter is one of the most impactful filters for Dutch recruitment.

**How it works:**

* Type a city, town, or region name in the location field
* An autocomplete dropdown appears with geocoded Dutch locations
* Select a location from the suggestions
* Set a radius in kilometers using the slider

**Radius-based filtering:**
The radius creates a circle around your chosen location. Only jobs within that circle are
included in results. Recruitier uses geocoded coordinates (latitude and longitude) for both
job locations and your search location, so distance calculations are precise.

| Radius  | Typical Use Case                                 |
| ------- | ------------------------------------------------ |
| 10 km   | Dense urban areas (Amsterdam centrum, Rotterdam) |
| 25 km   | City and surrounding suburbs                     |
| 50 km   | Standard commuting range in the Netherlands      |
| 75 km   | Extended commuting or flexible about location    |
| 100+ km | Wide regional search                             |

<Tip>
  The Netherlands is a compact country. A 50 km radius from Utrecht covers most of the
  Randstad, including Amsterdam, Rotterdam, The Hague, and surrounding cities. For
  nationwide searches, you may not need a location filter at all.
</Tip>

**Important notes about location filtering:**

* Location filtering requires the job listing to have a recognized, geocoded location. Jobs
  without a parsed location are excluded from radius-based searches.
* If your candidate is open to remote work, consider using the flexibility filter set to
  "Remote" instead of (or alongside) a location filter.
* Location data is geocoded during the scraping process. Most Dutch cities, towns, and
  neighborhoods are recognized. Locations with unusual formatting or very specific addresses
  may occasionally fail to geocode.

<Warning>
  When you enable location filtering, jobs without geocoded coordinates are excluded from
  results entirely. If a job listing does not include a parseable location (e.g., it says
  "Multiple locations" or "Netherlands-wide"), it will not appear in location-filtered
  results. Consider running a parallel search without location filters if you suspect
  relevant jobs might lack location data.
</Warning>

## Experience Level

Filter jobs by the seniority level required. You can select **multiple** experience levels
to cast a wider net.

**Available levels:**

| Level      | Description                                                                                  |
| ---------- | -------------------------------------------------------------------------------------------- |
| **Junior** | Entry-level roles, typically 0-2 years of experience. Often include training or mentorship.  |
| **Medior** | Mid-level roles, typically 2-5 years of experience. Expected to work independently.          |
| **Senior** | Senior roles, typically 5+ years of experience. Leadership and mentoring responsibilities.   |
| **Lead**   | Leadership roles overseeing teams or technical direction. Often combined with hands-on work. |

<Note>
  Experience level is extracted from job descriptions during scraping using AI parsing.
  Not all job listings explicitly state a level. Jobs without a parsed experience level
  are **not** excluded by this filter -- they remain in results so you do not miss
  opportunities where the level was implied but not stated explicitly.
</Note>

**Best practices:**

* Selecting both "medior" and "senior" covers the broadest range for experienced candidates
* If your candidate is transitioning from one level to another, include both levels
* Lead-level roles are less common; combine with "senior" for better coverage
* Junior roles often have different skill expectations; consider adjusting your confirmed
  skills if you switch from a senior to junior search

## Job Type

Filter by the employment arrangement. Multiple selections are supported.

**Available types:**

| Type           | Description                                                                                    |
| -------------- | ---------------------------------------------------------------------------------------------- |
| **Full-time**  | Standard full-time employment, typically 36-40 hours per week in the Dutch market.             |
| **Part-time**  | Reduced hours, common in the Netherlands where part-time work is widely accepted.              |
| **Contract**   | Fixed-term or project-based engagements. Includes ZZP (freelance) and interim roles.           |
| **Temporary**  | Temporary positions with a defined end date, such as seasonal work or short-term replacements. |
| **Internship** | Trainee or internship positions, often associated with students or career changers.            |

<Info>
  In the Dutch recruitment market, part-time roles are far more common than in many other
  countries. If your candidate is open to part-time, including this option can significantly
  expand your results. The Netherlands has one of the highest rates of part-time employment
  in Europe.
</Info>

## Flexibility

Filter by workplace arrangement. This has become one of the most important filters since
the shift to remote and hybrid work models.

**Available options:**

| Option      | Description                                                                  |
| ----------- | ---------------------------------------------------------------------------- |
| **Remote**  | Fully remote positions. The candidate can work from anywhere (or from home). |
| **Hybrid**  | A mix of office and remote work, typically 2-3 days in the office per week.  |
| **On-site** | The role requires full-time presence at the company's physical location.     |

**How flexibility interacts with location:**

* **Remote** roles are relevant regardless of location, so consider widening your radius
  or removing the location filter entirely when searching for remote positions
* **Hybrid** roles still have a physical office, so location matters -- the candidate
  needs to commute on in-office days
* **On-site** roles require daily commuting, making the location radius especially important

<Tip>
  For maximum flexibility, select all three options (remote, hybrid, on-site) and let
  the relevance scoring handle the ranking. You can always filter within your results
  afterward using the in-results filters.
</Tip>

## Posted Within (Recency)

Control how far back in time to look for job listings. More recent postings are more likely
to still be open and accepting applications.

**Available ranges:**

| Range             | Best For                                                                      |
| ----------------- | ----------------------------------------------------------------------------- |
| **Past 24 hours** | Finding the freshest listings for a hot candidate ready to apply immediately. |
| **Past week**     | A good default for active searches -- recent enough to be relevant.           |
| **Past month**    | Broader search when you need more options or are in a niche market.           |
| **Past 6 months** | Comprehensive search, though older listings may have been filled.             |
| **Anytime**       | No time restriction. Returns all matching jobs regardless of posting date.    |

<Warning>
  Older job listings may no longer be accepting applications. Recruitier detects expired
  listings and marks them with an "expired" badge, but detection is not instantaneous.
  Prioritize recent postings for the best response rates.
</Warning>

<Note>
  The posting date shown in results comes from the most reliable source available. Recruitier
  detects dates from multiple sources in order of reliability: JSON-LD structured data,
  LLM extraction, HTML metadata, visible text on the page, URL patterns, sitemap data,
  and finally the date Recruitier first discovered the listing. The source is tracked
  internally so the most accurate date is always displayed.
</Note>

## Salary Range

Set a minimum and/or maximum salary to filter positions within your candidate's expected
compensation range.

**How it works:**

* Enter a minimum and/or maximum annual salary value
* Recruitier filters results to only include jobs where the listed salary falls within
  your specified range
* Salary data is in EUR by default

**Limitations to be aware of:**

* Not all job listings include salary information. Jobs without salary data are **not
  excluded** by this filter -- they remain in results because the salary might still
  be competitive even though it is not published.
* Salary ranges vary by source and may represent gross annual, gross monthly, or hourly
  rates depending on how the employer published them.
* Salary data (salary\_min and salary\_max) is stored per scraped job when available. Both
  fields must be present for the filter to match meaningfully.

<Info>
  In the Dutch market, many job listings do not publish salary information. The salary
  filter is most useful for industries where salary transparency is common (e.g.,
  government, larger corporates). For roles where salary is rarely published, consider
  leaving this filter empty and evaluating salary fit during the review stage.
</Info>

## Include Companies

Limit search results to jobs from specific companies.

**How it works:**

* Type a company name in the search field and select from the results
* Add as many companies as you want -- results will only include jobs from the listed
  companies
* A status indicator shows whether the filter is active: when no companies are added,
  all jobs are searched; when companies are added, only jobs from those companies appear
* Remove a company by clicking the X on its badge
* Use the **Clear All** button to reset the include list

### Import Clients

The **Import Clients** button lets you quickly add all your saved client companies from
your Clients section to the include list. This is particularly useful when you want to
find new job openings at companies you are already working with, saving you the time of
searching for and adding each client individually.

<Tip>
  Import Clients is a powerful workflow shortcut. If you maintain an active client list
  in Recruitier, one click brings all those companies into your search scope, ensuring
  you never miss a new opening at a company you already have a relationship with.
</Tip>

## Exclude Companies

Remove specific companies from search results entirely.

**How it works:**

* Type a company name in the search field and select from the results
* Jobs from excluded companies will not appear in your search results
* This is useful for filtering out companies your candidate has already rejected,
  competitors, or companies with known issues

<Note>
  A company cannot appear in both the include and exclude lists. When you search for a
  company to add, companies already in either list are hidden from the search results to
  prevent conflicts.
</Note>

## Company Size

Filter by the number of employees at the hiring company.

**How it works:**

* Click one of the preset buttons to set a maximum employee count, or enter a custom
  number in the input field
* This is particularly useful for candidates who prefer startups, scale-ups, or SMEs
  over large enterprises
* Companies without employee count data are included in results (the filter does not
  exclude them)
* Click the same preset button again to deselect it

**Preset thresholds:**

| Maximum Size | Target Organizations                      |
| ------------ | ----------------------------------------- |
| 50           | Startups and micro-companies              |
| 200          | Scale-ups and small companies             |
| 500          | Mid-size companies                        |
| 1,000        | Upper mid-market                          |
| 5,000        | Large enterprises                         |
| Custom       | Enter any number for a specific threshold |
| No limit     | All companies including large enterprises |

## Industry

Filter by the industry sector of the hiring company.

**How it works:**

* Select one or more industries from the dropdown
* Results are limited to jobs at companies classified in the selected industries
* Company industries are sourced from LinkedIn and other public data
* Companies without industry data are still included (the filter only excludes companies
  with a different specified industry)

<Note>
  Staffing and recruiting agencies are automatically excluded from client search results
  to prevent showing competitor agencies. This filter is always active in client discovery
  but does not affect the job search -- you may still see agency-posted job listings in
  your search results. The exclusion list is maintained in the platform's configuration.
</Note>

## Exclude Terms

In addition to skill exclusions (set in Step 2), you can exclude specific terms from your
search results. Jobs containing excluded terms in their title or description will be
filtered out or ranked lower.

This is useful for avoiding:

* Specific technologies your candidate does not want to work with
* Industry jargon that indicates a different type of role
* Company types or work arrangements that are not suitable

## Combining Filters Effectively

The most effective searches use a thoughtful combination of filters rather than applying
every available option. Here are some proven combinations:

**For a specific local candidate:**

* Job title + confirmed skills
* Location with 30 km radius
* Experience level matching the candidate
* Job type: full-time

**For a remote-first candidate:**

* Job title + confirmed skills
* Flexibility: remote
* No location filter (or very wide radius)
* Posted within: past month

**For a niche specialist:**

* Specific job title
* Skills: only the most critical 3-4 skills confirmed
* Company size: depends on preference
* Posted within: past 6 months or anytime (niche roles are rarer)

**For a broad market scan:**

* General job title (e.g., "Developer" rather than "Senior React Developer")
* Minimal filters
* Posted within: past month
* Sort results by match score and review top 50

<Tip>
  Start broad and narrow down. It is easier to add filters to a search that returns too
  many results than to loosen filters on a search that returns too few. You can also
  clone a search and adjust filters on the clone to compare different criteria sets.
</Tip>

## Advanced

### Filter Processing Architecture

Understanding how filters are processed helps explain performance characteristics and
edge cases:

**Qdrant-native filters (fastest):**
These filters are applied directly within the vector database query, meaning they reduce
the candidate set before any scoring happens:

* `company_name` -- Exact or partial company name match
* `location` -- Location string matching
* `experience_level` -- Enum-based filter
* `job_type` -- Enum-based filter
* `flexibility` -- Enum-based filter
* `is_active` -- Boolean filter for active/expired status
* Industry exclusions (internal, always applied)

**PostgreSQL post-filters (applied after vector search):**
These filters require relational database lookups and are applied after the initial vector
search returns candidate results:

* `company_size_max` -- Maximum employee count at the hiring company
* `skills` -- Confirmed skills for skills-based pre-filtering
* `exclude_skills` -- Skills to penalize or exclude
* `exclude_terms` -- Terms to exclude from results
* `salary_min` / `salary_max` -- Salary range thresholds
* Date range filters (posted within)
* `geo_radius` -- Latitude/longitude with kilometer radius
* `company_ids` -- Specific company ID whitelist
* `industries` -- Industry sector filter
* `technologies` -- Technology stack filter

### Adaptive Search Strategy

The search engine intelligently adapts its strategy based on which filters you have enabled:

| Filter Scenario                   | Search Strategy                                                                                                       |
| --------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| No filters applied                | Direct Qdrant vector search (fastest path)                                                                            |
| Geo filter only                   | PostgreSQL geo-query identifies jobs within radius, then Qdrant searches within those job IDs                         |
| Skills filter only                | PostgreSQL skills query identifies relevant jobs, then Qdrant searches within those job IDs                           |
| Geo + Skills                      | PostgreSQL computes the intersection of geo results and skills results, then Qdrant searches within that intersection |
| Qdrant-native filters only        | Filters applied inline with the vector query (very fast)                                                              |
| Mixed Qdrant + PostgreSQL filters | Qdrant-native filters applied first, PostgreSQL post-filters applied to the returned results                          |

This adaptive approach ensures the search is as fast as possible regardless of filter
complexity. The most common filter combinations (just experience level and location)
benefit from the fastest code paths.

### How Filter Interactions Affect Results

<Accordion title="Location + Flexibility interaction">
  When you set both a location filter and a flexibility filter, be aware that remote jobs
  may list their location as the company headquarters rather than "Remote." A remote job
  at a company in Amsterdam will pass a location filter centered on Amsterdam, but a
  remote job at a company in Groningen will not -- even though both are fully remote.
  For remote searches, consider removing the location filter entirely or setting a very
  wide radius.
</Accordion>

<Accordion title="Experience level + Skills interaction">
  Experience level filtering and skill confirmation interact in important ways. A "Senior"
  filter combined with skills like "React" and "TypeScript" will rank highly for senior
  frontend roles. But if you also confirm "Team Leadership" (which the AI might extract
  for senior roles), you may inadvertently bias results toward management-track roles
  rather than individual contributor positions. Be intentional about which skills you
  confirm for each experience level.
</Accordion>

<Accordion title="Salary filter with missing data">
  Since many Dutch job listings omit salary information, the salary filter is designed to
  be inclusive: jobs without salary data are kept in results. This means you may see
  results where the salary is unknown alongside results that meet your minimum. The
  salary filter is most effective as a floor, not as a precision filter. Use it to
  eliminate obviously under-budget positions rather than to find exact salary matches.
</Accordion>

<Accordion title="Multiple filter stacking">
  Each additional filter narrows your result set. The relationship is multiplicative, not
  additive -- combining 4-5 filters can dramatically reduce your results. If you get too
  few results, remove filters in order of least importance. Typically, location and
  experience level are the most important to keep; salary and company size can often be
  relaxed.
</Accordion>

### Power-User Tips

* **Use clone + filter variation** to compare results with different filter sets without
  losing your original search
* **Leave salary empty** for your first search, then use in-results sorting to identify
  salary ranges in the market before creating a filtered search
* **Select multiple experience levels** (e.g., medior + senior) and then filter within
  results to see how many jobs exist at each level -- this gives you market intelligence
* **Combine location filter with flexibility: hybrid** for the most accurate commute-based
  results, since hybrid roles have a meaningful physical location

## Related

* [Creating a Search](/jobs/search/creating-a-search) -- Steps 3 and 4 of the wizard
  where filters are configured
* [Search Results](/jobs/search/search-results) -- In-results filtering after the search
  completes
* [How Search Technology Works](/jobs/search/how-search-works) -- How filters integrate
  into the search pipeline
