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

> Navigate and filter your search results to find the best opportunities.

## The Results Page

After a search completes, you are taken to the search detail page where all matching
jobs are displayed in a structured table. This page is your primary workspace for
evaluating and acting on search results.

The results page has three main areas:

1. **Search info panel** at the top -- shows the search name, criteria summary, and
   metadata
2. **Filter and action bar** -- provides sorting, filtering, and batch operation controls
3. **Results table** -- the main list of matching jobs with key details in each row

## Results Table Layout

Each row in the results table represents a single job listing and displays the following
columns:

| Column          | Description                                                                                                                  |
| --------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| **Match Score** | A percentage score (30-99%) indicating how well the job matches your search criteria. Higher scores appear first by default. |
| **Title**       | The job title as listed on the company's career page.                                                                        |
| **Company**     | The name of the hiring company, often with a favicon and LinkedIn link.                                                      |
| **Location**    | Where the job is based (city/region).                                                                                        |
| **Date**        | When the job was posted (or first seen by Recruitier's scrapers).                                                            |
| **Experience**  | The experience level if parsed from the listing (junior, medior, senior, lead).                                              |
| **Job Type**    | Employment type (full-time, part-time, contract, temporary, internship).                                                     |
| **Flexibility** | Workplace arrangement (remote, hybrid, on-site).                                                                             |
| **Tags**        | Any tags you have applied to this job.                                                                                       |
| **Status**      | Badges indicating the job's state (e.g., "Expired," "New," "Via Agency").                                                    |

<Tip>
  Click on any row to expand it and see additional details without leaving the results
  page. For the full job detail view, click the job title link or the expand icon.
</Tip>

## Understanding Match Scores

The match score is a percentage that represents how well a job listing aligns with your
search criteria. It is calculated by combining multiple signals from the hybrid search
engine.

### Score Components

The base score comes from the vector similarity search, which combines three vector types:

| Component             | Weight | What It Measures                                                                 |
| --------------------- | ------ | -------------------------------------------------------------------------------- |
| **Title similarity**  | 35%    | How semantically similar the job title is to your search query                   |
| **Skills overlap**    | 45%    | How many of your confirmed skills appear in the job description and requirements |
| **Description match** | 20%    | How semantically similar the full job description is to your search context      |

### Scoring Bonuses

Additional bonuses are added on top of the base score. These bonuses are **additive** --
they can only increase a score, never decrease it:

| Bonus                    | Maximum | How It Works                                                                                                                          |
| ------------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| **BM25 keyword bonus**   | +10%    | When your exact search terms appear in the listing text. BM25 scores are normalized: `Display% = min(score / 8.0 * 100, 99%)`         |
| **Recency bonus**        | +5%     | For recently posted jobs. Decays linearly over 180 days -- a job posted today gets the full 5%, a job posted 90 days ago gets \~2.5%. |
| **Title keyword boost**  | +4%     | When your query keywords appear directly in the job title.                                                                            |
| **Skills keyword boost** | +2%     | When your query keywords appear in the job's listed skills.                                                                           |

### Score Normalization

Raw scores from the search engine are normalized to a display range of **30% to 99%**
using the formula:

```
Display% = 30 + (score / max_score) * (99 - 30)
```

The top-scoring result in any search typically shows around 90-99%, with all other results
scaled proportionally relative to the top score.

<Note>
  Because scores are normalized relative to the top result in each search, a 75% score in
  one search is not directly comparable to a 75% score in a different search. Scores are
  meaningful for ranking within a single search but should not be compared across searches.
</Note>

### Score Interpretation Guide

| Score Range | Interpretation                                                                    | Action                                                    |
| ----------- | --------------------------------------------------------------------------------- | --------------------------------------------------------- |
| **85-99%**  | Excellent match. The job closely aligns with all your search criteria.            | Review immediately -- these are your top opportunities.   |
| **70-84%**  | Strong match. The job aligns with most criteria but may diverge on one dimension. | Worth reviewing -- often just as relevant as top matches. |
| **50-69%**  | Moderate match. The job has significant overlap but misses some criteria.         | Review selectively if higher-scoring options are limited. |
| **30-49%**  | Weak match. Some relevance but likely a different type of role or focus area.     | Generally skip unless the specific job catches your eye.  |

## Sorting Options

By default, results are sorted by **match score** (highest first). You can change the
sort order by clicking on any column header:

* **Match Score** -- Default sort. Shows the most relevant jobs first.
* **Date** -- Sort by posting date. Useful when you want the freshest listings at the top.
* **Company Name** -- Alphabetical sort by company. Helpful for seeing all jobs from the
  same company grouped together.
* **Title** -- Alphabetical sort by job title.
* **Location** -- Sort by location name.

Click a column header once to sort ascending, click again to sort descending. The active
sort column is indicated by an arrow icon.

<Tip>
  Sorting by **Date** after your initial review is a good way to identify recently posted
  jobs that may not have scored highest but represent fresh opportunities with less
  competition from other recruiters.
</Tip>

## Filtering Within Results

Beyond the filters you set during search creation, the results page offers additional
ways to narrow down what you see. These in-results filters operate on your existing
result set without re-running the search.

### Attribute Filters

Use the filter dropdowns above the results table to filter by specific attributes:

* **Experience level** -- Show only jobs at a specific level
* **Job type** -- Show only full-time, part-time, etc.
* **Flexibility** -- Show only remote, hybrid, or on-site
* **Match type** -- Filter by AI classification using the match quality dropdown. Options
  include: All Jobs, Excellent Only, Good + Excellent, or individual match types
  (Excellent, Good, Poor). Each option shows a count of matching jobs.
* **Active only** -- Toggle to show only jobs that have not expired

### Tag Filters

If you have tagged any jobs in the search, you can filter by tag. This is particularly
useful after an initial review pass where you tagged promising jobs:

* Click the tag filter dropdown
* Select one or more tags to filter by
* Only jobs with the selected tags are shown

### Search Within Results

Use the search-within-results text field to find specific terms within the displayed
results. This performs a client-side text filter across job titles, company names, and
locations. It does not re-run the search -- it simply hides non-matching rows.

<Tip>
  Combining search-within-results with attribute filters is a powerful way to drill down
  into large result sets. For example, filter by "senior" experience level and then
  search for "Amsterdam" to find senior roles specifically in Amsterdam.
</Tip>

## The Search Info Panel

At the top of the results page, an expandable panel shows the full details of your search
criteria:

* **Search name** (the job title you entered)
* **Skills** that were included in the search (confirmed, excluded, and custom)
* **Filters** that were applied (location, experience, job type, flexibility, etc.)
* **Creation date** and time
* **Total results count**
* **Search state** (searching, classifying, done)
* **Source** of the search (recommendation engine, LinkedIn, etc.)

Click the panel header to expand or collapse this information. It is especially useful
when returning to a saved search and needing to remember what criteria produced these
results.

## Batch Operations

You can perform actions on multiple jobs at once using the batch operations toolbar:

1. **Select jobs** -- Use the checkbox on each row, or use the "Select All" checkbox
   in the header to select all visible jobs
2. **Choose an action** from the batch toolbar that appears:
   * **Tag** -- Apply a tag to all selected jobs
   * **Delete** -- Remove selected jobs from this search
   * **Export** -- Export selected job details

<Warning>
  Deleting jobs from a search is a soft delete. The jobs are removed from this search's
  results but the underlying job data remains in the system. This action cannot be undone
  from the UI. Be particularly careful when using "Select All" -- make sure your filters
  are set correctly so you do not accidentally delete jobs you want to keep.
</Warning>

## New Job Indicators

When a monitored search finds new jobs that match your criteria, those jobs appear with
a "New" badge in the results. This makes it easy to spot freshly matched listings without
reviewing the entire result set.

The new jobs count is also shown on the search card in the saved searches list. When you
open the search detail page, the new job indicators are automatically cleared (marked as
seen), and the `new_jobs_count` on the search entity resets to zero.

<Info>
  New job notifications are delivered in real time via Server-Sent Events (SSE). If you
  have the Recruitier interface open, you will see a notification badge update without
  needing to refresh the page.
</Info>

## Expired Job Indicators

Jobs that are no longer available on the company's career page are marked with an
"Expired" badge and a timestamp showing when the listing was detected as expired.
Expired jobs are still visible in your results for reference, but they should not be
prioritized for outreach.

You can use the "Active only" filter to hide expired jobs and focus on positions that
are still accepting applications.

## Job Classifications

Recruitier's AI classifies each result into one of three match types based on keyword
coverage:

| Classification      | Keyword Match                   | Meaning                                                                                                               |
| ------------------- | ------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| **Excellent Match** | 100% of keywords found          | The job matches all your search keywords exactly. Strongest possible alignment with your criteria.                    |
| **Good Match**      | 80%+ of keywords found          | The job matches most of your criteria but may be missing one or two keywords or skills. Still highly relevant.        |
| **Poor Match**      | Less than 80% of keywords found | The job has some relevance but diverges on multiple criteria. May match on some keywords but miss the overall intent. |

You can filter by match type to focus your review on the highest-quality matches first,
then work your way down if needed. The match type filter dropdown provides convenient
presets: "Excellent Only" shows just the best matches, while "Good + Excellent" filters
out poor matches and shows only the results worth reviewing.

<Info>
  Poor matches can be automatically removed in bulk. If you find that a search has many
  poor matches, they can be cleaned up, leaving only excellent and good matches for your
  review. This keeps your result set focused and actionable.
</Info>

## Advanced

### How Scores Are Calculated Step by Step

The scoring pipeline processes each candidate job through the following steps:

1. **Multi-vector similarity** -- The search query embedding is compared against three
   vector types stored per job in Qdrant:
   * `title_vector` (384 dimensions, 35% weight)
   * `description_vector` (384 dimensions, 20% weight)
   * `skills_vector` (384 dimensions, 45% weight)

2. **Reciprocal Rank Fusion** -- Results from the three vector comparisons are combined
   using RRF: `score = 1/(k + rank)` summed across all vector sources. This produces a
   single ranking that balances all three signal types.

3. **BM25 overlay** -- The BM25 keyword search runs in parallel. Its results are
   normalized (`Display% = min(score / 8.0 * 100, 99%)`) and added as a bonus to the
   vector score. Maximum contribution: 10%.

4. **Keyword boosts** -- If your query keywords appear in the job title, a 4% boost is
   added. If they appear in the job's skills, a 2% boost is added. These are checked via
   string matching against the structured fields.

5. **Recency bonus** -- Jobs posted within the last 180 days receive a linearly decaying
   bonus up to 5%. A job posted today gets the full bonus; a job posted 90 days ago gets
   half.

6. **Score normalization** -- The final raw score is mapped to the 30-99% display range
   using the formula `Display% = 30 + (score/max_score) * (99-30)`. The highest-scoring
   result anchors the scale at approximately 99%.

### Match Classification Logic

After scoring, each result is classified based on keyword coverage analysis:

* The system checks which of your search keywords (job title terms + confirmed skills)
  appear in the job's title, description, and skills fields
* **EXCELLENT\_MATCH**: Every keyword is found somewhere in the job listing
* **GOOD\_MATCH**: 80% or more of keywords are found
* **POOR\_MATCH**: Less than 80% of keywords are found

This classification is separate from the numerical score. A job can have a high vector
similarity score (meaning it is semantically relevant) but be classified as a poor match
if it uses different terminology. Conversely, a job can be an excellent keyword match but
score lower if its overall description diverges from your search intent.

### How the "Source Keywords" Field Works

Each job in your search results stores a `source_keywords` field that records which
specific keywords from your search led to this job being matched. This is particularly
useful for boolean OR searches where multiple keyword combinations generate results.
The source keywords tell you which combination produced each specific result, helping
you understand why a particular job appeared.

### Performance Characteristics

* **Result delivery**: Results are delivered incrementally via SSE as the pipeline
  completes each stage. You may see partial results before the search finishes.
* **Typical processing time**: 10-60 seconds depending on filter complexity and result
  count. Searches with geo + skills filters take longest due to the PostgreSQL
  pre-filtering step.
* **Result limits**: The `pages` parameter on the search entity controls how many pages
  of results are fetched from the recommendation engine. More pages = more results but
  longer processing.

### Power-User Tips

<Accordion title="Review in waves">
  For large result sets (100+ jobs), adopt a wave-based review approach:

  1. First wave: Review only 85%+ matches. Tag the best as "Shortlist."
  2. Second wave: Review 70-84% matches. Tag additional finds as "Maybe."
  3. Third wave: Glance at 50-69% only if you need more options.
  4. Batch-delete all poor matches to clean up the result set.
</Accordion>

<Accordion title="Sort by date for competitive advantage">
  After reviewing top matches, re-sort by date (newest first). Recently posted jobs with
  moderate match scores may represent fresh opportunities where you can be among the first
  recruiters to reach out. The recency bonus already gives these a slight edge, but
  sorting by date surfaces them more prominently.
</Accordion>

<Accordion title="Use tag + filter combinations for pipeline management">
  Create a tagging system that mirrors your recruitment pipeline: "Shortlist" > "Contacted"

  > "Waiting" > "Interview" > "Placed". Then use the tag filter to view each stage
  > independently. Combined with the active-only filter, this gives you a real-time view of
  > your active pipeline.
</Accordion>

## Related

* [Saved Searches](/jobs/search/saved-searches) -- Managing and monitoring your searches
* [How Search Technology Works](/jobs/search/how-search-works) -- Deep dive into the
  scoring engine
* [Tagging Jobs](/jobs/tagging-jobs) -- Organizing results with custom tags
* [Active Jobs](/jobs/active-jobs) -- Filtering for jobs still accepting applications
