Case HR Tech

Recruitment Data is Fuzzy. Hiring Constraints Aren't.

Power job search, candidate matching, and recommendation systems for scaled talent platforms.

result = client.query_points(
    collection_name="jobs",
    prefetch=[
        models.Prefetch(
            query=dense_emb, using="dense",
            ),
        models.Prefetch(
            query=sparse_vec, using="sparse",
            ),
    ],
    query=models.FusionQuery(
        fusion=models.Fusion.RRF),
    query_filter=models.Filter(must=[
         models.FieldCondition(
            key="location",
            match=models.MatchAny(any=["london", "remote"]),
         ),
         models.FieldCondition(
            key="salary_max",
            range=models.Range(gte=60000),
         ),
    ]),
    limit=20,
)
Code
Step 1

Embed - Parse + Embed Resume / JD

Filter
Step 2

Search - Semantic Search + Strict Filter

List
Step 3

Rank - Rank + Rerank (Optional)

Check
Step 4

Result - Evidence-based Match

Filter Advanced filters for hiring constraints
Rocket Real-time matching speed
Dollar Optimize at scale to meet budget
Server Native inference capability

“Qdrant is the last thing I worry about breaking.”

Elvis Moraa avatar

Elvis Moraa

Engineering Lead, Pariti

2.4x

increase in hiring fill rate


70%

reduction in candidate vetting time


Why Teams Choose Qdrant

Recruitment Search is Broken at Scale

Many HR tech teams don't start with vector search. They start with Elasticsearch, PGVector, or a managed API, and hit a wall when the product needs compound filters at scale, multi-language support, or sub-second latency on millions of vectors. These are the engineering problems that surface, and the pain we hear from teams switching.

Alert
Inconsistent Taxonomies

"Senior Software Engineer," "Staff Dev," and "Lead SWE" might be the same role. Keyword search misses these. Semantic search doesn't. Embeddings catch them.

Alert
Fuzzy Data with Constraints

Skills and titles are inconsistent across resumes, but location, work authorization, and certifications are hard constraints. You need semantic similarity AND hard filters on the same query.

What Our Clients Say

Evaluating Migration?

Our solutions engineers do technical deep-dives with HR tech teams weekly.

Book a Session

What you can build with Qdrant

Search
Modernized Job Search

Layer semantic relevance on top of existing keyword/Boolean patterns with hybrid search. Apply strict metadata filters alongside vector similarity, no post-filter penalty.

Alert
Similar Jobs & Candidates

Layer semantic relevance on top of existing keyword/Boolean patterns with hybrid search. Apply strict metadata filters alongside vector similarity, no post-filter penalty.

How It Works Under the Hood

Architecture patterns with API examples for the problems above.

Semantic Match with Hard Hiring Constraints

Embed the job description or resume, then apply must-match payload filters for non-negotiable constraints. Filters applied during HNSW traversal, not after, so recall doesn't degrade.

View Full Example
Check
Pre-filter during graph traversal

Compound filters on location, salary, category don't cause latency spikes.

Check
Hybrid Search

Combine dense + sparse vectors with Reciprocal Rank Fusion in a single query.

Check
Native Inferencing

Use Qdrant Cloud inference to simplify your data pipeline.

# Pattern: hybrid semantic + keyword with filters
# → see docs for complete example
result = client.query_points(
    collection_name="jobs",
    prefetch=[
        models.Prefetch(
            query=dense_emb, using="dense",
            limit=100),
        models.Prefetch(
            query=sparse_vec, using="sparse",
            limit=100),
    ],
    query=models.FusionQuery(
        fusion=models.Fusion.RRF),
    query_filter=models.Filter(must=[
        models.FieldCondition(
            key="location",
            match=models.MatchAny(any=["london", "remote"]),
        ),
        models.FieldCondition(
            key="salary_max",
            range=models.Range(gte=60000),
        ),
    ]),
    limit=20,
)

Quantization for 10M+ Vectors

Scalar and binary quantization compress vectors 4-32x in memory. At 10M+ candidate or job vectors.

View Full Example
Check
Scalar Quantization

4x memory reduction with minimal recall loss. One config flag.

Check
Predictable Cost

fixed infra cost for vector search means retrieval across multiple pipeline stages without margin erosion.

# Pattern: quantized collection for scale
# → see docs for complete example
client.create_collection(
    collection_name="candidates_quantized",
    vectors_config={
        "dense": models.VectorParams(
            size=1536,
            distance=models.Distance.COSINE,
        ),
    },
    sparse_vectors_config={
        "sparse": models.SparseVectorParams(
            modifier=models.Modifier.IDF,
        ),
    },
    quantization_config=models.ScalarQuantization(
        scalar=models.ScalarQuantizationConfig(
            type=models.ScalarType.INT8,
            quantile=0.99,
            always_ram=True,
        )
    ),
)

"Similar Jobs" and Candidate Discovery

Recommendation-style retrieval using existing points as query inputs. Pass positive and negative examples, no embedding step needed on the query side.

View Full Example
Check
Recommend by Point ID

No re-embedding required. Just pass the job or candidate ID.

Check
Positive + Negative Examples

"More like these 3, less like that one": refine without retraining.

# Pattern: recommend by point ID
# → see docs for complete example
result = client.query_points(
    collection_name="jobs",
    query=models.RecommendQuery(
        recommend=models.RecommendInput(
          positive=[0], # job_id_0
          negative=[1], # job_id_1
        )
    ),
    using="dense",
    query_filter=models.Filter(
        must=[
            models.FieldCondition(
                key="category",
match=models.MatchValue(value="engineering"),
            ),
            models.FieldCondition(
                key="remote",
                match=models.MatchValue(value=True),
            ),
        ]
    ),
    limit=20,
)

Pariti is referral-driven hiring marketplace in Africa. Qdrant vector search ranks 70k candidates in real time.

Pariti · HR Tech

20% → 48%

Hiring Fill Rate

Read the Full Case Study

FAQs

How Does Vector Search Improve Job Matching Compared to Keyword Search?
Keyword search requires candidates to guess the exact terms employers use. A job seeker searching "development" gets "business development" results mixed in with software engineering roles. Vector search converts job descriptions, resumes, and queries into embeddings that capture meaning, so "Senior Software Engineer," "Staff Dev," and "Lead SWE" all surface as semantically similar. Qdrant combines this semantic matching with strict payload filters (location, salary range, work authorization) in a single query, so results are both relevant and compliant with hard hiring constraints.
Can Qdrant Handle Millions of Job or Candidate Vectors Without Performance Degradation?
Yes. Qdrant is built in Rust with a custom HNSW implementation and storage engine designed for high-throughput, concurrent read/write workloads. Recruiting platforms commonly maintain millions of vectors (candidates and jobs combined) with heavy daily update loads. Scalar and binary quantization compress vectors 4 to 32x in memory, which helps keep infrastructure costs predictable as you scale. Filters are applied during HNSW graph traversal, not after, so compound queries on location, salary, category, and experience level avoid the recall degradation and latency spikes that other architectures can produce.
Is Qdrant Compliant with HIPAA, GDPR, and Data Residency Requirements for HR Data?
Qdrant Cloud is SOC 2 Type 2 certified and supports HIPAA-compliant deployments with a Business Associate Agreement (BAA) for healthcare recruiting platforms. For teams with GDPR or data residency requirements, Qdrant offers Hybrid Cloud deployment: your data stays on your own AWS, GCP, or Azure infrastructure while Qdrant manages the control plane. On-premises and fully air-gapped deployments are also available for organizations that require complete data sovereignty.
How Does Qdrant Compare to Elasticsearch or OpenSearch for Recruiting Search?
Elasticsearch and OpenSearch were designed for full-text keyword search and log analytics, not semantic vector retrieval. Teams that bolt vector search onto these systems often report filter performance degradation, over-provisioned clusters to handle burst traffic, and complex operational overhead. Qdrant is purpose-built for vector workloads: filters execute during graph traversal (not as a post-processing step), hybrid search combines dense semantic vectors with sparse BM25 keyword vectors in a single query, and the Rust-based engine provides consistent low-latency performance without the memory overhead of JVM-based systems. Some HR tech teams that evaluate Qdrant are replacing an existing search stack, not building from scratch.
Does Qdrant Support Geospatial Search for Location-Based Job Matching?
Yes. Qdrant has native geospatial filtering that lets you run radius queries and bounding-box filters alongside vector search in the same request. For job boards operating across multiple countries or regions, this means you can combine semantic job matching with location constraints without maintaining a separate geospatial index. This is a common reason teams explore alternatives to solutions where geospatial and vector search are difficult to combine without custom engineering.
Can Qdrant Support Multi-Language Job Search for International Job Boards?
Qdrant is embedding-model agnostic, which means it supports any multi-language embedding model your team selects (such as multilingual-e5, Cohere multilingual, or OpenAI embeddings). For teams that want to simplify their pipeline, Qdrant Cloud Inference handles embedding directly within Qdrant, so you can send raw text (job descriptions, resumes, queries in any language) and skip managing a separate inference service. Job boards expanding from a single market to multiple countries can store all language variants in the same collection and query across them with consistent performance. Combined with regional deployment options and geospatial filtering, this lets you scale from one market to dozens without re-architecting your search infrastructure.
What Latency Can I Expect from Qdrant for Real-Time Candidate or Job Search?
Qdrant helps teams meet aggressive latency goals on collections with billions of vectors, including filtered queries. This matters for recruiting platforms because search latency directly affects candidate experience: slow search times lead to measurable user abandonment. Qdrant maintains performance during concurrent ingestion (daily job or candidate updates) and search traffic, helping avoid the latency spikes that commonly occur during peak hours or batch update windows.

Talk to an expert about
HR marketplace retrieval.

Get guidance on scaling search, matching, and recommendations beyond 20M vectors.

Talk to an Expert
Rocket flying over globe illustration