mirror of
https://github.com/qdrant/landing_page.git
synced 2026-09-25 22:18:30 +02:00
Filtered search benchmarks (#112)
* new: add filtered search bench draft * new: update filtered search benchmark post * new: render article * refactoring: add newlines * new: add filtered search bench file structure, add chart * fix: fix plot preselect * fix: fix canvas id * debug: debug js * debug: add benchmark filter search script to header * fix: fix filter search plot selection * new: update benchmark data * refactoring: remove commented code * fix: fix bench data * new: fix labels order * new: sort dataset labels * new: add some text * fix: fix descriptions * debug: fix mapping not allowed yaml parsing error * new: update bench data * fix: fix dataset name * new: update bench data * fix: fix qdrant kw small vocab * text for the articles * upd text * fix: fix typos * new: replace bars with scatter plots * fix: fix method calls * debug: add initializer * fix: replace debug const with variable * new: remove data based split, remain only one plot * fix: remove geo data for milvus * new: remove range data for weaviate * new: remove int 2048 for milvus, as it crashes at the moment * upd graphs * link --------- Co-authored-by: Andrey Vasnetsov <andrey@vasnetsov.com>
This commit is contained in:
co-authored by
Andrey Vasnetsov
parent
9e0fe47712
commit
faad182279
@@ -6,6 +6,7 @@ keywords:
|
||||
- ANN Benchmark
|
||||
- Qdrant vs Milvus
|
||||
- Qdrant vs Weaviate
|
||||
- Qdrant vs Redis
|
||||
- Qdrant vs ElasticSearch
|
||||
- benchmark
|
||||
- performance
|
||||
|
||||
@@ -19,8 +19,8 @@ So in our benchmarks, we **focus on the relative numbers**, so it is possible to
|
||||
The list will be updated:
|
||||
|
||||
* Upload & Search speed on single node - [Benchmark](/benchmarks/single-node-speed-benchmark/)
|
||||
* Filtered search benchmark - [Benchmark](/benchmarks/#filtered-search-benchmark)
|
||||
* Memory consumption benchmark - TBD
|
||||
* Filtered search benchmark - TBD
|
||||
* Cluster mode benchmark - TBD
|
||||
|
||||
Some of our experiment design decisions are described at [F.A.Q Section](/benchmarks/#benchmarks-faq).
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
---
|
||||
draft: false
|
||||
id: 5
|
||||
title:
|
||||
description:
|
||||
|
||||
filter_data: /benchmarks/filter-result-2023-02-03.json
|
||||
date: 2023-02-13
|
||||
weight: 4
|
||||
---
|
||||
|
||||
|
||||
## Filtered Results
|
||||
|
||||
As you can see from the charts, there are three main patterns:
|
||||
|
||||
- **Speed boost** - for some engines/queries, the filtered search is faster than the unfiltered one. It might happen if the filter is restrictive enough, to completely avoid the usage of the vector index.
|
||||
|
||||
- **Speed downturn** - some engines struggle to keep high RPS, it might be related to the requirement of building a filtering mask for the dataset, as described above.
|
||||
|
||||
- **Accuracy collapse** - some engines are loosing accuracy dramatically under some filters. It is related to the fact that the HNSW graph becomes disconnected, and the search becomes unreliable.
|
||||
|
||||
Qdrant avoids all these problems and also benefits from the speed boost, as it implements an advanced [query planning strategy](/documentation/search/#query-planning).
|
||||
|
||||
<aside role="status">The Filtering Benchmark is all about changes in performance between filter and un-filtered queries. Please refer to the search benchmark for absolute speed comparison.</aside>
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
draft: false
|
||||
id: 4
|
||||
title: Filtered search benchmark
|
||||
description:
|
||||
|
||||
date: 2023-02-13
|
||||
weight: 3
|
||||
---
|
||||
|
||||
# Filtered search benchmark
|
||||
|
||||
Applying filters to search results brings a whole new level of complexity.
|
||||
It is no longer enough to apply one algorithm to plain data. With filtering, it becomes a matter of the _cross-integration_ of the different indices.
|
||||
|
||||
To measure how well different engines perform in this scenario, we have prepared a set of **Filtered ANN Benchmark Datasets** -
|
||||
https://github.com/qdrant/ann-filtering-benchmark-datasets
|
||||
|
||||
|
||||
It is similar to the ones used in the [ann-benchmarks project](https://github.com/erikbern/ann-benchmarks/) but enriched with payload metadata and pre-generated filtering requests. It includes synthetic and real-world datasets with various filters, from keywords to geo-spatial queries.
|
||||
|
||||
### Why filtering is not trivial?
|
||||
|
||||
Not many ANN algorithms are compatible with filtering.
|
||||
HNSW is one of the few of them, but search engines approach its integration in different ways:
|
||||
|
||||
- Some use **post-filtering**, which applies filters after ANN search. It doesn't scale well as it either loses results or requires many candidates on the first stage.
|
||||
- Others use **pre-filtering**, which requires a binary mask of the whole dataset to be passed into the ANN algorithm. It is also not scalable, as the mask size grows linearly with the dataset size.
|
||||
|
||||
On top of it, there is also a problem with search accuracy.
|
||||
It appears if too many vectors are filtered out, so the HNSW graph becomes disconnected.
|
||||
|
||||
Qdrant uses a different approach, not requiring pre- or post-filtering while addressing the accuracy problem.
|
||||
Read more about the Qdrant approach in our [Filtrable HNSW](/articles/filtrable-hnsw/) article.
|
||||
Reference in New Issue
Block a user