-
Notifications
You must be signed in to change notification settings - Fork 104
[blog] Qdrant Version 1.14 #1529
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 1 commit
Commits
Show all changes
25 commits
Select commit
Hold shift + click to select a range
e5bf677
add blog
davidmyriel c5ed43c
Update qdrant-landing/content/blog/qdrant-1.14.x.md
davidmyriel e55b55b
Update qdrant-landing/content/blog/qdrant-1.14.x.md
davidmyriel 77dc66c
fix text
davidmyriel ea3c114
front matter
davidmyriel 90d1dfc
add images
davidmyriel 5cd3ac3
fix description
davidmyriel 8b435f2
fix details
davidmyriel 2524069
Update qdrant-landing/content/blog/qdrant-1.14.x.md
davidmyriel b21e9d2
Update qdrant-landing/content/blog/qdrant-1.14.x.md
davidmyriel d1fb8cc
Update qdrant-landing/content/blog/qdrant-1.14.x.md
davidmyriel a7d9615
Update qdrant-landing/content/blog/qdrant-1.14.x.md
davidmyriel 08e2435
Update qdrant-1.14.x.md
davidmyriel 33ed944
add two more features
davidmyriel 15c2127
Update community.jpg
davidmyriel 0e6726e
Update community.jpg
davidmyriel 8c5bbb9
Update qdrant-landing/content/blog/qdrant-1.14.x.md
davidmyriel 27c11b0
Update qdrant-landing/content/blog/qdrant-1.14.x.md
davidmyriel 03fa7e8
Update qdrant-landing/content/blog/qdrant-1.14.x.md
davidmyriel a464196
Update qdrant-landing/content/blog/qdrant-1.14.x.md
davidmyriel 51fefde
Update qdrant-landing/content/blog/qdrant-1.14.x.md
davidmyriel 4210f17
Update qdrant-landing/content/blog/qdrant-1.14.x.md
davidmyriel ed88661
Update qdrant-landing/content/blog/qdrant-1.14.x.md
davidmyriel d85cbc0
remove section
davidmyriel e0cf5ba
update images
davidmyriel File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,181 @@ | ||
--- | ||
title: "Qdrant 1.14 - Reranking Support, More Resource Optimizations & Cost Tracking" | ||
draft: false | ||
short_description: "" | ||
description: "" | ||
preview_image: /blog/qdrant-1.14.x/social_preview.png | ||
social_preview_image: /blog/qdrant-1.14.x/social_preview.png | ||
date: 2025-03-25T00:00:00-08:00 | ||
author: David Myriel | ||
featured: true | ||
tags: | ||
--- | ||
|
||
[**Qdrant 1.14.0 is out!**](https://github.com/qdrant/qdrant/releases/tag/v1.14.0) Let's look at the main features for this version: | ||
|
||
**Score-Boosting Reranker:** Blend vector similarity with custom rules and context.</br> | ||
**Smarter Resource Utilization:** CPU and disk IO optimization for faster processing.</br> | ||
|
||
**Memory Optimization:** Reduced usage for large datasets with improved ID tracking.</br> | ||
**IO Measurements:** Detailed cost tracking for performance analysis.</br> | ||
**RocksDB to Gridstore:** Additional reliance on our custom KV store. </br> | ||
|
||
## Score-Boosting Reranker | ||
 | ||
|
||
When integrating vector search into specific applications, you might want to tweak the final result list using domain or business logic. For example, if you are building a **chatbot or search on website content**, you might want to rank results with `title` metadata higher than `body_text` in your results. | ||
|
||
In **e-commerce** you may want to boost products from a specific manufacturer—perhaps because you have a promotion or need to clear inventory. With this update, you can easily influence ranking using metadata like `brand` or `stock_status`. | ||
|
||
> The **Score-Boosting Reranker** allows you to combine vector-based similarity with **business or domain-specific logic** by applying a **rescoring step** on top of the standard semantic or distance-based ranking. | ||
|
||
As you structure the query, you can define a `formula` that references both existing scores (like cosine similarities) and additional payload data (e.g., timestamps, location info, numeric attributes). Let's take a look at some examples: | ||
|
||
### Idea 1: Prioritizing Website Content | ||
|
||
Imagine you have vectors for **titles**, **paragraphs**, and **code snippet** sections of your documentation. You can create a `tag` payload field that indicates whether a point is a title, paragraph, or snippet. Then, to give more weight to titles and paragraphs, you might do something like: | ||
|
||
``` | ||
score = score + (is_title * 0.5) + (is_paragraph * 0.25) | ||
``` | ||
|
||
**Above is just sample logic - but here is the actual Qdrant API request:** | ||
|
||
```bash | ||
POST /collections/{collection_name}/points/query | ||
{ | ||
"prefetch": { | ||
"query": [0.2, 0.8, ...], // <-- dense vector for the query | ||
"limit": 50 | ||
}, | ||
"query": { | ||
"formula": { | ||
"sum": [ | ||
"$score", | ||
{ | ||
"mult": [ | ||
0.5, | ||
{ "key": "tag", "match": { "any": ["h1","h2","h3","h4"] } } | ||
] | ||
}, | ||
{ | ||
"mult": [ | ||
0.25, | ||
{ "key": "tag", "match": { "any": ["p","li"] } } | ||
] | ||
} | ||
] | ||
} | ||
} | ||
} | ||
``` | ||
|
||
### Idea 2: Reranking Most Recent Results | ||
|
||
One of the most important advancements is the ability to prioritize recency. In many scenarios, such as in news or job listings, users want to see the most recent results first. Until now, this wasn’t possible without additional work: *you had to fetch all the data and manually filter for the latest entries on their side*. | ||
|
||
Now, the similarity score **doesn’t have to rely solely on cosine distance**. It can also take into account how recent the data is, allowing for much more dynamic and context-aware ranking. | ||
|
||
> With the Score-Boosting Reranker, simply add a `date` payload field and factor it into your formula so fresher data rises to the top. | ||
|
||
davidmyriel marked this conversation as resolved.
Show resolved
Hide resolved
|
||
### Idea 3: Factor in Geographical Proximity | ||
|
||
Let’s say you’re searching for a restaurant serving Currywurst. Sure, Berlin has some of the best, but you probably don’t want to spend two days traveling for a sausage covered in magical seasoning. The best match is the one that **balances the distance with a real-world geographical distance**. You want your users see relevant and conveniently located options. | ||
davidmyriel marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
This feature introduces a multi-objective optimization: combining semantic similarity with geographical proximity. Suppose each point has a `geo.location` payload field (latitude, longitude). You can use a `gauss_decay` function to clamp the distance into a 0–1 range and add that to your similarity score: | ||
|
||
``` | ||
score = $score + gauss_decay(distance) | ||
``` | ||
|
||
**Example Query**: | ||
|
||
```bash | ||
POST /collections/{collection_name}/points/query | ||
{ | ||
"prefetch": { | ||
"query": [0.2, 0.8, ...], | ||
"limit": 50 | ||
}, | ||
"query": { | ||
"formula": { | ||
"sum": [ | ||
"$score", | ||
{ | ||
"gauss_decay": { | ||
"scale": 5000, // e.g. 5 km | ||
"x": { | ||
"geo_distance": { | ||
"origin": { "lat": 52.504043, "lon": 13.393236 }, // Berlin | ||
"to": "geo.location" | ||
} | ||
} | ||
} | ||
} | ||
] | ||
}, | ||
"defaults": { | ||
"geo.location": { "lat": 48.137154, "lon": 11.576124 } // Munich | ||
} | ||
} | ||
} | ||
``` | ||
|
||
You can tweak parameters like target, scale, and midpoint to shape how quickly the score decays over distance. This is extremely useful for local search scenarios, where location is a major factor but not the only factor. | ||
|
||
> This is a very powerful feature that allows for extensive customization. Read more about this feature in the [**Hybrid Queries Documentation**](/documentation/concepts/hybrid-queries/) | ||
|
||
## Smarter Resource Utilization During Optimization | ||
|
||
Qdrant now **saturates CPU and disk IO** more effectively in parallel when optimizing segments. This helps reduce the "sawtooth" usage pattern—where CPU or disk often sat idle while waiting on the other resource. | ||
|
||
This leads to **faster optimizations**, which are specially noticeable on large machines handling big data movement. | ||
It also gives you **predictable performance**, as there are fewer sudden spikes or slowdowns during indexing and merging operations. | ||
|
||
**Figure 1:** Indexing 400 million vectors - CPU and disk usage profiles. | ||
davidmyriel marked this conversation as resolved.
Show resolved
Hide resolved
|
||
 | ||
|
||
**Observed Results:** The improvement is especially noticeable during large-scale indexing. In our experiment, **we indexed 400 million 512-dimensional vectors**. The previous version of Qdrant took around 40 hours on an 8-core machine, while the development version with this change completed the task in just 28 hours. | ||
davidmyriel marked this conversation as resolved.
Show resolved
Hide resolved
davidmyriel marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
### Minor Fixes & Optimizations | ||
 | ||
|
||
**Optimized Memory Usage in Immutable Segments** | ||
|
||
We revamped how the ID tracker and related metadata structures store data in memory. This can result in a notable RAM reduction for very large datasets (hundreds of millions of vectors). | ||
|
||
This causes **much lower overhead**, where memory savings let you store more vectors on the same hardware. Also, improved scalability is a major benefit. If your workload was near the RAM limit, this might let you push further **without using additional servers**. | ||
|
||
**IO Measurements for Serverless Deployments** | ||
|
||
Qdrant 1.14 introduces detailed tracking of **read/write costs** (CPU, disk, etc.) per operation. This is primarily intended for serverless billing, but also helps diagnose performance hotspots in dedicated setups. | ||
|
||
> Now you can have **full cost visibility**, and you can understand exactly which queries or updates cause the most overhead. | ||
|
||
This also makes for easier optimization - you can tweak indexes, partitioning, or formula queries to reduce resource usage based on concrete metrics. | ||
|
||
**Ending our Reliance on RocksDB** | ||
davidmyriel marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
The **mutable ID tracker no longer relies on RocksDB**. This continues our journey toward minimal external dependencies. With our custom-built [**Gridstore**](/articles/gridstore-key-value-storage/), you can expect fewer random compactions and more predictable disk usage. | ||
davidmyriel marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
This reduces complexity, with fewer external data engines in your stack. | ||
davidmyriel marked this conversation as resolved.
Show resolved
Hide resolved
|
||
It also leads to better performance, by eliminating potential latency spikes from RocksDB's background operations. | ||
|
||
 | ||
|
||
*Read more about how we built [**Gridstore, our custom key-value store**](/articles/gridstore-key-value-storage/).* | ||
|
||
## Upgrading to Version 1.14 | ||
|
||
With Qdrant 1.14, all client libraries remain fully compatible. If you do not need custom payload-based ranking, **your existing workflows remain unchanged**. | ||
|
||
> **Upgrading from earlier versions is straightforward** — no major API or index-breaking changes. | ||
|
||
In **Qdrant Cloud**, simply go to your **Cluster Details** screen and select **Version 1.14** from the dropdown. The upgrade may take a few moments. | ||
|
||
 | ||
|
||
**Documentation:** For a full list of formula expressions, conditions, decay functions, and usage examples, see the official [**Qdrant documentation**](https://qdrant.tech/documentation) and the [**API reference**](https://api.qdrant.tech/). This includes detailed code snippets for popular languages and a variety of advanced reranking examples. | ||
|
||
**We'd love to hear your feedback:** If you have questions or want to share your experience, join our [**Discord**](https://qdrant.to/join-slack) or open an issue on [**GitHub**](https://github.com/qdrant/qdrant/issues). | ||
|
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.