Updated Articles Pages (#1329)

* Updated Articles Pages

* fixes

* Links removed

* Fixed url

* light theme fix

* toc fix

* new article categories

* categorize articles

* fix article preview images

* rename categories

---------

Co-authored-by: trean <trean.mi@gmail.com>
Co-authored-by: generall <andrey@vasnetsov.com>
This commit is contained in:
nastyapash
2024-12-20 12:10:51 +00:00
committed by GitHub
co-authored by trean generall
parent 481b359860
commit 5baacc44ec
82 changed files with 619 additions and 142 deletions
@@ -5,4 +5,8 @@ description: Articles about vector search and similarity larning related topics.
section_title: Check out our latest publications
subtitle: Check out our latest publications
img: /articles_data/title-img.png
partition: learn
learnButton: Learn More
isMainPage: true
toc_start_level: 2
---
@@ -8,6 +8,7 @@ weight: -150
author: Kacper Łukawski
author_link: https://www.kacperlukawski.com
date: 2024-11-22T00:00:00.000Z
category: rag-and-genai
---
Standard [Retrieval Augmented Generation](/articles/what-is-rag-in-ai/) follows a predictable, linear path: receive
@@ -13,6 +13,7 @@ tags:
- Vector Database
- Machine Learning
- Information Retrieval
category: vector-search-manuals
---
# How to Optimize Vector Search Using Batch Search in Qdrant 0.10.0
@@ -22,6 +22,7 @@ tags:
weight: -130
aliases: [ /blog/binary-quantization-openai/ ]
category: practicle-examples
---
OpenAI Ada-003 embeddings are a powerful tool for natural language processing (NLP). However, the size of the embeddings are a challenge, especially with real-time search and retrieval. In this article, we explore how you can use Qdrant's Binary Quantization to enhance the performance and efficiency of OpenAI embeddings.
@@ -217,4 +218,4 @@ Binary quantization is exceptional if you need to work with large volumes of dat
The article gives examples of data sets and configuration you can use to get going. Our documentation covers [adding large datasets to Qdrant](/documentation/tutorials/bulk-upload/) to your Qdrant instance as well as [more quantization methods](/documentation/guides/quantization/).
Want to discuss these findings and learn more about Binary Quantization? [Join our Discord community.](https://discord.gg/qdrant)
Want to discuss these findings and learn more about Binary Quantization? [Join our Discord community.](https://discord.gg/qdrant)
@@ -14,6 +14,7 @@ keywords:
- vector search
- binary quantization
- memory optimization
category: qdrant-internals
---
# Optimizing High-Dimensional Vectors with Binary Quantization
+1
View File
@@ -12,6 +12,7 @@ keywords:
- hybrid search
- sparse embeddings
- bm25
category: machine-learning
---
<aside role="status">
@@ -11,6 +11,7 @@ author_link: https://medium.com/@yusufsarigoz
date: 2022-06-28T13:00:00+03:00
draft: false
# aliases: [ /articles/cars-recognition/ ]
category: machine-learning
---
Supervised classification is one of the most widely used training objectives in machine learning,
@@ -16,6 +16,7 @@ keywords:
- chatgpt plugin
- knowledge base
- similarity search
category: practicle-examples
---
In recent months, ChatGPT has revolutionised the way we communicate, learn, and interact
@@ -15,6 +15,7 @@ keywords:
- reranking
- fastembed
- qsoc'24
category: machine-learning
---
## Introduction
@@ -0,0 +1,8 @@
---
title: Data Exploration
description: Learn how you can leverage vector similarity beyond just search. Reveal hidden patterns and insights in your data, provide recommendations, and navigate data space.
category: data-exploration
url: /articles/data-exploration/
isCategoryPage: true
weight: 30
---
@@ -15,6 +15,7 @@ keywords: # Keywords for SEO
- Secure AI Data Management
- Qdrant Data Security
- Enterprise Data Compliance
category: vector-search-manuals
---
Data stored in vector databases is often proprietary to the enterprise and may include sensitive information like customer records, legal contracts, electronic health records (EHR), financial data, and intellectual property. Moreover, strong security measures become critical to safeguarding this data. If the data stored in a vector database is not secured, it may open a vulnerability known as "[embedding inversion attack](https://arxiv.org/abs/2004.00053)," where malicious actors could potentially [reconstruct the original data from the embeddings](https://arxiv.org/pdf/2305.03010) themselves.
@@ -9,6 +9,7 @@ weight: 8
author: George Panchuk
author_link: https://medium.com/@george.panchuk
date: 2022-07-18T10:18:00.000Z
category: data-exploration
# aliases: [ /articles/dataset-quality/ ]
---
Nowadays, people create a huge number of applications of various types and solve problems in different areas.
@@ -15,6 +15,7 @@ keywords:
- vector search
- best practices
- anti-patterns
category: qdrant-internals
---
@@ -10,6 +10,7 @@ author: Yusuf Sarıgöz
author_link: https://medium.com/@yusufsarigoz
date: 2022-05-04T13:00:00+03:00
draft: false
category: machine-learning
# aliases: [ /articles/detecting-coffee-anomalies/ ]
---
@@ -11,13 +11,13 @@ author_link: https://www.linkedin.com/in/j16n/
date: 2024-08-31T10:39:48.312Z
draft: false
keywords:
- dimension reduction
- web assembly
- qsoc'24
- vector similarity
- tsne
- qdrant data visualization
category: ecosystem
---
@@ -17,6 +17,7 @@ keywords:
- multimodal
- state-of-the-art
- vector-search
category: data-exploration
---
# Discovery needs context
@@ -0,0 +1,8 @@
---
title: Ecosystem
description: Tools, libraries and integrations around Qdrant vector search engine.
category: ecosystem
url: /articles/ecosystem/
isCategoryPage: true
weight:
---
@@ -11,6 +11,7 @@ author_link: https://medium.com/@yusufsarigoz
date: 2022-08-23T13:00:00+03:00
draft: false
aliases: [ /articles/embedding-recycler/ ]
category: machine-learning
---
A recent [paper](https://arxiv.org/abs/2207.04993)
@@ -9,6 +9,7 @@ weight: 9
author: George Panchuk
author_link: https://medium.com/@george.panchuk
date: 2022-06-28T08:57:07.604Z
category: practicle-examples
# aliases: [ /articles/faq-question-answering/ ]
---
@@ -19,6 +19,7 @@ keywords:
- embeddings
- ONNX Runtime
- quantized embedding model
category: ecosystem
---
Data Science and Machine Learning practitioners often find themselves navigating through a labyrinth of models, libraries, and frameworks. Which model to choose, what embedding size, and how to approach tokenizing, are just some questions you are faced with when starting your work. We understood how many data scientists wanted an easier and more intuitive means to do their embedding work. This is why we built FastEmbed, a Python library engineered for speed, efficiency, and usability. We have created easy to use default workflows, handling the 80% use cases in NLP embedding.
@@ -10,6 +10,7 @@ weight: 60
date: 2019-11-24T22:44:08+03:00
author: Andrei Vasnetsov
author_link: https://blog.vasnetsov.com/
category: qdrant-internals
# aliases: [ /articles/filtrable-hnsw/ ]
---
@@ -9,6 +9,7 @@ weight: -30
author: Kacper Łukawski
author_link: https://medium.com/@lukawskikacper
date: 2023-09-05T11:32:00.000Z
category: practicle-examples
---
Not every search journey begins with a specific destination in mind. Sometimes, you just want to explore and see what’s out there and what you might like.
@@ -10,12 +10,12 @@ author: Zein Wen
author_link: https://www.linkedin.com/in/zishenwen/
date: 2023-10-12T08:00:00+03:00
draft: false
keywords:
keywords:
- payload filtering
- geo polygon
- search condition
- gsoc'23
- gsoc'23
category: qdrant-internals
---
@@ -8,6 +8,7 @@ weight: -150
author: Kacper Łukawski
author_link: https://kacperlukawski.com
date: 2024-07-25T00:00:00.000Z
category: vector-search-manuals
---
It's been over a year since we published the original article on how to build a hybrid
@@ -14,6 +14,7 @@ keywords:
- immutable data structures
- perfect hashing
- defragmentation
category: qdrant-internals
---
## Data Structures 101
@@ -15,6 +15,7 @@ keywords:
- linux
- optimization
aliases: [ /articles/io-uring/ ]
category: qdrant-internals
---
With Qdrant [version 1.3.0](https://github.com/qdrant/qdrant/releases/tag/v1.3.0) we
@@ -18,6 +18,7 @@ keywords:
- question answering
- openai
- embeddings
category: practicle-examples
---
# Streamlining Question Answering: Simplifying Integration with LangChain and Qdrant
@@ -8,6 +8,7 @@ weight: -160
author: Kacper Łukawski
author_link: https://kacperlukawski.com
date: 2024-08-14T00:00:00.000Z
category: machine-learning
---
\* At least any open-source model, since you need access to its internals.
@@ -0,0 +1,8 @@
---
title: Machine Learning
description: Explore Machine Learning principles and practices which make modern semantic similarity search possible. Apply Qdrant and vector search capabilities to your ML projects.
category: machine-learning
url: /articles/machine-learning/
isCategoryPage: true
weight: 40
---
@@ -9,6 +9,7 @@ weight: 7
author: Andrei Vasnetsov
author_link: https://blog.vasnetsov.com/
date: 2022-12-07T10:18:00.000Z
category: qdrant-internals
# aliases: [ /articles/memory-consumption/ ]
---
@@ -10,6 +10,7 @@ weight: 20
author: Andrei Vasnetsov
author_link: https://blog.vasnetsov.com/
date: 2021-05-15T10:18:00.000Z
category: machine-learning
# aliases: [ /articles/metric-learning-tips/ ]
---
@@ -12,6 +12,7 @@ tags:
- sparse retrieval
- splade
- bm25
category: machine-learning
---
Finding enough time to study all the modern solutions while keeping your production running is rarely feasible.
@@ -14,6 +14,7 @@ keywords:
- custom sharding
- multiple partitions
- vector database
category: vector-search-manuals
---
# Scaling Your Machine Learning Setup: The Power of Multitenancy and Custom Sharding in Qdrant
@@ -10,6 +10,7 @@ weight: 50
author: Andrey Vasnetsov
author_link: https://blog.vasnetsov.com/
date: 2021-06-10T10:18:00.000Z
category: vector-search-manuals
# aliases: [ /articles/neural-search-tutorial/ ]
---
# Neural Search 101: A Comprehensive Guide and Step-by-Step Tutorial
@@ -0,0 +1,8 @@
---
title: Practical Examples
description: Building blocks and reference implementations to help you get started with Qdrant. Learn how to use Qdrant to solve real-world problems and build the next generation of AI applications.
category: practicle-examples
url: /articles/practicle-examples/
isCategoryPage: true
weight: 60
---
@@ -14,6 +14,7 @@ keywords:
- vector search
- product quantization
- memory optimization
category: qdrant-internals
aliases: [ /articles/product_quantization/ ]
---
@@ -16,6 +16,7 @@ keywords:
- cohere
- co.embed
- embeddings
category: practicle-examples
---
Bi-encoders are probably the most efficient way of setting up a semantic Question Answering system.
@@ -0,0 +1,8 @@
---
title: Qdrant Internals
description: Take a look under the hood of Qdrant’s high-performance vector search engine. Explore the architecture, components, and design principles the Qdrant Vector Search Engine is built on.
category: qdrant-internals
url: /articles/qdrant-internals/
isCategoryPage: true
weight: 20
---
@@ -0,0 +1,8 @@
---
title: RAG & GenAI
description: Leverage Qdrant for Retrieval-Augmented Generation (RAG) and build AI Agents
category: rag-and-genai
url: /articles/rag-and-genai/
isCategoryPage: true
weight: 50
---
@@ -15,6 +15,7 @@ keywords:
- vector search
- retrieval augmented generation
- gemini 1.5
category: rag-and-genai
---
# Is RAG Dead? The Role of Vector Databases in AI Efficiency and Vector Search
@@ -17,6 +17,7 @@ keywords:
- quotient
- optimization
- rag
category: rag-and-genai
---
In today's fast-paced, information-rich world, AI is revolutionizing knowledge management. The systematic process of capturing, distributing, and effectively using knowledge within an organization is one of the fields in which AI provides exceptional value today.
@@ -14,6 +14,7 @@ keywords:
- vector search
- scalar quantization
- memory optimization
category: qdrant-internals
---
# Efficiency Unleashed: The Power of Scalar Quantization
@@ -11,6 +11,7 @@ author_link: https://llogiq.github.io
date: 2023-08-14T00:00:00+01:00
draft: false
keywords: search, semantic, vector, llm, integration, benchmark, recommend, performance, rust
category: practicle-examples
---
Qdrant is one of the fastest vector search engines out there, so while looking for a demo to show off, we came upon the idea to do a search-as-you-type box with a fully semantic search backend. Now we already have a semantic/keyword hybrid search on our website. But that one is written in Python, which incurs some overhead for the interpreter. Naturally, I wanted to see how fast I could go using Rust.
@@ -18,6 +18,7 @@ tags:
- AI applications
- data retrieval
- efficient data storage
category: rag-and-genai
---
## What is Semantic Cache?
@@ -11,6 +11,7 @@ author_link: https://llogiq.github.io
date: 2023-07-12T10:00:00+01:00
draft: false
keywords: rust, serverless, lambda, semantic, search
category: practicle-examples
---
Do you want to insert a semantic search function into your website or online app? Now you can do so - without spending any money! In this example, you will learn how to create a free prototype search engine for your own non-commercial purposes.
@@ -15,6 +15,7 @@ keywords:
- SPLADE
- hybrid search
- vector search
category: vector-search-manuals
---
Think of a library with a vast index card system. Each index card only has a few keywords marked out (sparse vector) of a large possible set for each book (document). This is what sparse vectors enable for text.
@@ -14,6 +14,7 @@ tags:
- Database
- Search
- Similarity Search
category: vector-search-manuals
---
# How to Optimize Vector Storage by Storing Multiple Vectors Per Object
@@ -9,6 +9,7 @@ weight: 30
author: Yusuf Sarıgöz
author_link: https://medium.com/@yusufsarigoz
date: 2022-03-24T15:12:00+03:00
category: machine-learning
# aliases: [ /articles/triplet-loss/ ]
---
@@ -8,6 +8,7 @@ weight: -200
author: Sabrina Aquino, David Myriel
author_link:
date: 2024-09-10T00:00:00.000Z
category: vector-search-manuals
---
Imagine you sell computer hardware. To help shoppers easily find products on your website, you need to have a **user-friendly [search engine](https://qdrant.tech)**.
@@ -0,0 +1,8 @@
---
title: Vector Search Manuals
description: Take full control of your vector data with Qdrant. Learn how to easily store, organize, and optimize vectors for high-performance similarity search.
category: vector-search-manuals
url: /articles/vector-search-manuals/
isCategoryPage: true
weight: 10
---
@@ -17,6 +17,7 @@ keywords:
- discovery
- diversity
- recommendation
category: data-exploration
---
# Vector Similarity: Unleashing Data Insights Beyond Traditional Search
@@ -11,13 +11,13 @@ author_link: https://kartik-gupta-ij.vercel.app/
date: 2023-08-28T08:00:00+03:00
draft: false
keywords:
- vector reduction
- console
- gsoc'23
- vector similarity
- exploration
- recommendation
category: ecosystem
---
@@ -18,7 +18,7 @@ tags:
- embeddings
- machine-learning
- artificial intelligence
category: vector-search-manuals
---
> **Embeddings** are numerical machine learning representations of the semantic of the input data. They capture the meaning of complex, high-dimensional data, like text, images, or audio, into vectors. Enabling algorithms to process and analyze the data more efficiently.
@@ -15,6 +15,7 @@ tags:
- vector-search
- vector-database
- embeddings
category: vector-search-manuals
---
## What Is a Vector Database?
@@ -17,7 +17,7 @@ tags:
- product quantization
- scalar quantization
- vector compression
category: vector-search-manuals
---
Vector quantization is a data compression technique used to reduce the size of high-dimensional data. Compressing vectors reduces memory usage while maintaining nearly all of the essential information. This method allows for more efficient storage and faster search operations, particularly in large datasets.
@@ -18,8 +18,7 @@ tags:
- embeddings
- llm rag
- rag application
category: rag-and-genai
---
> Retrieval-augmented generation (RAG) integrates external information retrieval into the process of generating responses by Large Language Models (LLMs). It searches a database for information beyond its pre-trained knowledge base, significantly improving the accuracy and relevance of the generated responses.
@@ -96,4 +96,4 @@ Qdrant is an AI-native vector database and a semantic search engine. You can use
| [A Complete Guide to Filtering in Vector Search](/articles/vector-search-filtering/) </br> Beginner & advanced examples showing how to improve precision in vector search.| [Building Hybrid Search with Query API](/articles/hybrid-search/) </br> Build a pure vector-based hybrid search system with our new fusion feature.|
|----------------------------------------------|-------------------------------|
| [Multitenancy and Sharding: Best Practices](/articles/multitenancy/) </br> Combine two powerful features for complete data isolation and scaling.| [Benefits of Binary Quantization in Vector Search](/articles/binary-quantization/) </br> Compress data points while retaining essential meaning for extreme search performance.|
| [Multitenancy and Sharding: Best Practices](/articles/multitenancy/) </br> Combine two powerful features for complete data isolation and scaling.| [Benefits of Binary Quantization in Vector Search](/articles/binary-quantization/) </br> Compress data points while retaining essential meaning for extreme search performance.|
@@ -16,9 +16,9 @@ menuItems:
- id: menu-2
name: Build
url: /documentation/build/
# - id: menu-3
# name: Learn
# url: /documentation/learn/
- id: menu-3
name: Learn
url: /articles/
- id: menu-4
name: API Reference
url: https://api.qdrant.tech/api-reference
Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 261 KiB

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 337 KiB

After

Width:  |  Height:  |  Size: 296 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 KiB

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 KiB

After

Width:  |  Height:  |  Size: 130 KiB

@@ -1,31 +1,134 @@
@use '../../helpers/functions' as *;
@use 'sass:math';
.dev-portal-articles-posts {
.docs-articles {
&__title {
margin-bottom: math.div($spacer, 2);
font-size: $spacer * 1.5;
line-height: $spacer * 2;
color: $neutral-98;
}
&__description {
margin-bottom: 0;
color: $neutral-70;
}
&__blocks {
display: flex;
flex-direction: column;
gap: $spacer * 5;
padding-bottom: $spacer * 3;
}
&__block {
&-header {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: $spacer * 1.5;
}
&-link {
flex-shrink: 0;
}
}
&__list {
padding-bottom: $spacer * 3;
}
&__posts {
margin-top: $spacer * 2;
}
&__pagination {
padding-top: $spacer * 5;
}
.post {
&-preview {
width: 100%;
height: auto;
padding-bottom: 0;
margin-bottom: $spacer;
border-radius: $spacer * 0.5;
height: auto;
}
&-title {
margin-bottom: math.div($spacer, 4);
font-size: pxToRem(18);
line-height: pxToRem(27);
color: $neutral-98;
}
&-description {
margin-bottom: $spacer * 0.5;
font-size: pxToRem(14);
line-height: pxToRem(21);
color: $neutral-70;
}
&-about {
display: flex;
justify-content: flex-start;
gap: $spacer * 0.5;
font-size: pxToRem(14);
line-height: pxToRem(21);
color: $neutral-50;
}
[data-theme="light"] & {
&-about {
color: $neutral-30;
}
&-title {
color: $neutral-30;
}
&-description {
color: $neutral-50;
font-weight: 400;
}
}
}
.post-sm {
.post-title {
font-size: pxToRem(18);
line-height: pxToRem(27);
}
.post-description {
font-size: pxToRem(14);
line-height: pxToRem(21);
}
}
.post-md {
.post-title {
font-size: pxToRem(20);
line-height: pxToRem(30);
}
.post-description {
font-size: $spacer;
line-height: $spacer * 1.5;
}
}
@include media-breakpoint-up(xl) {
&__block {
&-header {
flex-direction: row;
justify-content: space-between;
align-items: flex-end;
gap: $spacer * 4;
}
}
}
[data-theme="light"] & {
&__title {
color: $neutral-30;
}
&__description {
color: $neutral-50;
font-weight: 400;
}
}
}
@@ -5,6 +5,59 @@
padding-bottom: $spacer * 1.5;
font-weight: 400;
&__header {
margin-bottom: $spacer * 2;
.documentation-article__header-link {
display: flex;
align-items: center;
gap: $spacer * 0.5;
margin-bottom: $spacer;
padding: $spacer * 0.5 0;
color: $neutral-70;
&:hover {
color: $neutral-90;
svg path {
stroke: $neutral-90;
}
}
}
.documentation-article__header-title {
margin-bottom: $spacer;
padding-top: 0;
font-size: $spacer * 2;
line-height: pxToRem(38);
color: $neutral-98;
}
.documentation-article__header-about {
margin-bottom: $spacer * 2;
display: flex;
justify-content: flex-start;
gap: $spacer * 0.5;
font-size: pxToRem(14);
line-height: pxToRem(21);
color: $neutral-90;
p {
margin-bottom: 0;
}
}
.documentation-article__header-preview {
width: 100%;
margin: 0;
img {
display: block;
width: 100%;
height: auto;
margin: 0 auto;
}
}
}
h1 {
font-size: $spacer * 2;
line-height: pxToRem(38);
@@ -60,6 +113,13 @@
@include media-breakpoint-up(xl) {
width: 100%;
&__header {
.documentation-article__header-title {
font-size: $spacer * 2.5;
line-height: pxToRem(50);
}
}
}
}
@@ -84,5 +144,20 @@
@extend .table-light;
}
}
&__header-link {
color: $neutral-50;
svg path {
stroke: $neutral-50;
}
&:hover {
color: $neutral-30;
svg path {
stroke: $neutral-30;
}
}
}
&__header-about {
color: $neutral-50;
}
}
}
@@ -200,6 +200,17 @@
}
}
&__articles-link {
&.active {
background-color: $neutral-20;
border-radius: $spacer * 0.5;
a {
color: $neutral-98;
}
}
}
@include media-breakpoint-up(xl) {
height: calc(100vh - 80px);
width: pxToRem(256);
@@ -364,5 +375,16 @@
}
}
}
&__articles-link {
&.active {
background-color: $neutral-90;
border-radius: $spacer * 0.5;
a {
color: $neutral-30;
font-weight: bold;
}
}
}
}
}
@@ -5,6 +5,10 @@ import 'qdrant-page-search/dist/js/search.min.js';
window.initQdrantSearch({ searchApiUrl: 'https://search.qdrant.tech/api/search', section: 'documentation' });
}
if (/articles/.test(window.location?.pathname)) {
window.initQdrantSearch({ searchApiUrl: 'https://search.qdrant.tech/api/search', section: 'articles' });
}
if (/blog/.test(window.location?.pathname)) {
window.initQdrantSearch({ searchApiUrl: 'https://search.qdrant.tech/api/search', section: 'blog' });
}
@@ -4,14 +4,11 @@ class TableOfContents {
constructor(tocSelector, contentSelector) {
this.tocLinks = Array.from(document.querySelectorAll(`${tocSelector} a`));
this.headings = Array.from(
document.querySelectorAll(
`${contentSelector} h1, ${contentSelector} h2, ${contentSelector} h3`,
),
document.querySelectorAll(`${contentSelector} h1[id], ${contentSelector} h2[id], ${contentSelector} h3[id]`),
);
this.currentActiveIndex = -1; // Track the current active heading index
this.currentActive = null; // Track the current active heading element
this.debounceTimeout = null;
this.currentlyVisibleHeaderIds = new Set();
@@ -46,7 +43,6 @@ class TableOfContents {
// Setup Intersection Observer
setupObserver() {
const observerCallback = (entries) => {
entries.forEach((entry) => {
const entryIndex = this.headings.indexOf(entry.target);
const isIntersecting = entry.isIntersecting;
@@ -57,7 +53,7 @@ class TableOfContents {
this.currentlyVisibleHeaderIds.delete(entryIndex);
}
});
if (this.currentlyVisibleHeaderIds.size !== 0) {
let minimalVisibleHeaderId = Math.min(...Array.from(this.currentlyVisibleHeaderIds));
this.setActiveLink(minimalVisibleHeaderId);
@@ -1,12 +1,11 @@
{{ define "main" }}
{{ partial "site-header" . }}
{{ partial "qdrant-articles-hero" . }}
{{ partial "qdrant-articles-posts" . }}
{{ with (.Site.GetPage "/headless/get-started-blogs") }}
{{ partial "get-started-small" (dict "context" . "class" "get-started-blogs") }}
{{ end }}
{{ partial "newsletter" . }}
{{ end }}
<!doctype html>
<html lang="en">
{{- partial "head.html" . -}}
<body>
<main>
{{ partial "documentation/header" . }}
{{ partial "documentation/content-layout" . }}
</main>
</body>
{{ partial "js.html" . }}
</html>
@@ -1,9 +1,11 @@
{{ define "main" }}
{{ partial "site-header" . }}
{{ partial "qdrant-post" (dict "context" . "variant" "centered") }}
{{ with (.Site.GetPage "/headless/get-started-blogs") }}
{{ partial "get-started-small" (dict "context" . "class" "get-started-blogs") }}
{{ end }}
{{ end }}
<!doctype html>
<html lang="en">
{{- partial "head.html" . -}}
<body>
<main>
{{ partial "documentation/header" . }}
{{ partial "documentation/content-layout" . }}
</main>
</body>
{{ partial "js.html" . }}
</html>
@@ -6,7 +6,7 @@
<link href="{{ $splideCss.RelPermalink }}" rel="stylesheet" integrity="{{ $splideCss.Data.Integrity }}" />
{{ end }}
{{ if in (slice "blog" "docs" "documentation") .Section }}
{{ if in (slice "blog" "docs" "documentation" "articles") .Section }}
{{ $pageSearchCss := resources.Get "css/search/search.scss" | toCSS $opts | minify | resources.Fingerprint "sha512" }}
<link href="{{ $pageSearchCss.RelPermalink }}" rel="stylesheet" integrity="{{ $pageSearchCss.Data.Integrity }}" />
{{ end }}
@@ -21,7 +21,7 @@
/>
{{ end }}
{{ if in (slice "docs" "documentation") .Section }}
{{ if in (slice "docs" "documentation" "articles") .Section }}
{{ $documentationCss := resources.Get "css/documentation.scss" | toCSS $opts | minify | resources.Fingerprint "sha512" }}
<link
href="{{ $documentationCss.RelPermalink }}"
@@ -10,25 +10,172 @@
<div class="documentation__content">
<!-- todo: update this and styles to support both types of content on the same page-->
<div class="documentation__content-wrapper">
{{ if .Params.content }}
<div class="documentation__article-wrapper">
<div class="docs-core documentation-article">
{{ partial "documentation/custom-content.html" . }}
{{ if eq .Section "documentation" }}
{{ if .Params.content }}
<div class="documentation__article-wrapper">
<div class="docs-core documentation-article">
{{ partial "documentation/custom-content.html" . }}
</div>
</div>
</div>
{{ else }}
{{ else }}
<div class="documentation__article-wrapper">
{{ if not (eq .Params.breadcrumb false) }}
<div class="documentation__article-wrapper">
{{ if not (eq .Params.breadcrumb false) }}
{{ partial "documentation/breadcrumbs" . }}
{{ end }}
<article class="documentation-article">
{{ partial "article-content.html" . }}
</article>
{{ partial "documentation/feedback.html" . }}
</div>
{{ partial "table-of-contents" . }}
{{ end }}
{{ end }}
{{ if eq .Section "articles" }}
{{ $subject := site.GetPage "articles" }}
{{ $currentNode := .Params }}
{{ if .Params.isMainPage }}
<div class="docs-articles docs-articles__blocks">
{{ range $subject.Pages }}
{{ if .Params.isCategoryPage }}
<div class="docs-articles__block">
<div class="docs-articles__block-header">
<div>
<h4 class="docs-articles__title">{{ .Params.title }}</h4>
<p class="docs-articles__description">{{ .Params.description }}</p>
</div>
<a href="{{ .Params.url }}" class="docs-articles__block-link button button_outlined button_sm">
{{ $currentNode.learnButton }}
</a>
</div>
{{ $category := .Params.category }}
<div class="docs-articles__posts">
<div class="row gy-4">
{{ $list := first 0 site.Pages }}
{{ range $subject.Pages }}
{{ if and (eq .Params.category $category) (not .Params.isCategoryPage) }}
{{ $list = $list | append . }}
{{ end }}
{{ end }}
{{ $all := $list.ByPublishDate.Reverse }}
{{ range first 3 $all }}
<article class="col-12 col-lg-4 post post-sm">
<a class="post-link" href="{{ .RelPermalink }}">
<div class="post-preview">
<img src="{{ .Params.preview_dir }}/preview.jpg" alt="Preview" />
</div>
<h6 class="post-title">{{ .Params.title }}</h6>
<p class="post-description">{{ .Params.description }}</p>
<div class="post-about">
<p>{{ .Params.author }}</p>
<span>&middot;</span>
<p>{{ time.Format "January 02, 2006" .Date }}</p>
</div>
</a>
</article>
{{ end }}
</div>
</div>
</div>
{{ end }}
{{ end }}
</div>
{{ else if .Params.isCategoryPage }}
<div class="docs-articles docs-articles__list">
{{ partial "documentation/breadcrumbs" . }}
{{ end }}
<article class="documentation-article">
{{ partial "article-content.html" . }}
</article>
{{ partial "documentation/feedback.html" . }}
</div>
{{ partial "table-of-contents" . }}
<h4 class="docs-articles__title">{{ .Params.title }}</h4>
<p class="docs-articles__description">{{ .Params.description }}</p>
{{ $category := .Params.category }}
<div class="docs-articles__posts">
<div class="row gx-4 gy-5">
{{ $list := first 0 site.Pages }}
{{ range $subject.Pages }}
{{ if and (eq .Params.category $category) (not .Params.isCategoryPage) }}
{{ $list = $list | append . }}
{{ end }}
{{ end }}
{{ $all := $list.ByPublishDate.Reverse }}
{{ $paginator := .Paginate $all 14 }}
{{ range $paginator.Pages }}
<article class="col-12 col-lg-6 post post-md">
<a class="post-link" href="{{ .RelPermalink }}">
<div class="post-preview">
<img src="{{ .Params.preview_dir }}/preview.jpg" alt="Preview" />
</div>
<h6 class="post-title">{{ .Params.title }}</h6>
<p class="post-description">{{ .Params.description }}</p>
<div class="post-about">
<p>{{ .Params.author }}</p>
<span>&middot;</span>
<p>{{ time.Format "January 02, 2006" .Date }}</p>
</div>
</a>
</article>
{{ end }}
</div>
</div>
<div class="row">
<div class="docs-articles__pagination col-12">
{{ if gt $paginator.TotalPages 1 }}
{{ partial "pagination" $paginator }}
{{ end }}
</div>
</div>
</div>
{{ else }}
<div class="documentation__article-wrapper">
{{ partial "documentation/breadcrumbs" . }}
<article class="documentation-article">
<div class="documentation-article__header">
{{ $firstUrlElement := index (split .RelPermalink "/") 1 }}
{{ $url := path.Join $firstUrlElement .Params.category }}
<a href="/{{ $url }}/" class="documentation-article__header-link">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.6668 8.00004H1.3335M1.3335 8.00004L6.00016 12.6667M1.3335 8.00004L6.00016 3.33337" stroke="#8F98B3" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
{{ with (.Site.GetPage $url) }}
Back to {{ .Params.Title }}
{{ end }}
</a>
<h1 class="documentation-article__header-title">{{ .Params.title }}</h1>
<div class="documentation-article__header-about">
<p>{{ .Params.author }}</p>
<span>&middot;</span>
<p>{{ time.Format "January 02, 2006" .Date }}</p>
</div>
{{ if .Params.preview_dir }}
<picture class="documentation-article__header-preview">
<source srcset="{{ .Params.preview_dir }}/title.webp" type="image/webp" />
<img alt="{{ .Title }}" src="{{ .Params.preview_dir }}/title.jpg" />
</picture>
{{ else }}
<picture class="documentation-article__preview">
{{ partial "preview-image" (dict "context" . "default_file_name" "title.jpg" "preview_file" .Params.title_preview_image) }}
</picture>
{{ end }}
</div>
{{ partial "article-content.html" . }}
</article>
{{ partial "documentation/feedback.html" . }}
</div>
{{ partial "table-of-contents" . }}
{{ end }}
{{ end }}
{{ partial "documentation/footer.html" . }}
@@ -20,7 +20,7 @@
<a
class="menu-link {{- if eq (lower .name) $partition }}active{{- end -}}"
href="{{ .url }}"
{{ if (eq $index 3) }}target="_blank"{{ end }}
{{ if (eq $index 4) }}target="_blank"{{ end }}
>
{{ .name }}
</a>
@@ -1,4 +1,5 @@
{{ $partition := .partition }}
{{ $section := .Section }}
{{ $currentNode := .context }}
<div class="docs-menu">
@@ -18,93 +19,115 @@
</button>
</div>
{{ $subject := site.GetPage "documentation" }}
{{ if eq $currentNode.Section "documentation" }}
{{ $subject := site.GetPage "documentation" }}
<nav class="docs-menu__links">
{{ range $subject.Pages }}
{{ if and (eq .Params.partition $partition) (not .Params.hideInSidebar) }}
{{ if (eq .Params.type "delimiter") }}
<h3 class="docs-menu__links-title">{{ .Title }}</h3>
{{ else }}
{{ if and (.IsPage) (not .Params.hideInSidebar) }}
<div
class="docs-menu__links-group {{ if eq .File.UniqueID $currentNode.File.UniqueID }}active{{ end }}
{{- if (eq .Params.type "external-link") }}external-link{{ end -}} "
>
<div class="docs-menu__links-group-heading">
<a
href="{{ if (eq .Params.type "external-link") }}
{{ .Params.external_url }}
{{ else }}
{{ .Permalink }}
{{ end }}"
{{ if (eq .Params.type "external-link") }}target="_blank"{{ end }}
>
{{ .Title }}
</a>
<nav class="docs-menu__links">
{{ range $subject.Pages }}
{{ if and (eq .Params.partition $partition) (not .Params.hideInSidebar) }}
{{ if (eq .Params.type "delimiter") }}
<h3 class="docs-menu__links-title">{{ .Title }}</h3>
{{ else }}
{{ if and (.IsPage) (not .Params.hideInSidebar) }}
<div
class="docs-menu__links-group {{ if eq .File.UniqueID $currentNode.File.UniqueID }}active{{ end }}
{{- if (eq .Params.type "external-link") }}external-link{{ end -}} "
>
<div class="docs-menu__links-group-heading">
<a
href="{{ if (eq .Params.type "external-link") }}
{{ .Params.external_url }}
{{ else }}
{{ .Permalink }}
{{ end }}"
{{ if (eq .Params.type "external-link") }}target="_blank"{{ end }}
>
{{ .Title }}
</a>
</div>
</div>
</div>
{{ end }}
{{ end }}
{{ if and (.IsSection) (not .Params.hideInSidebar) }}
{{ if and (.IsSection) (not .Params.hideInSidebar) }}
<!-- current page is active or any sub-page is active -->
{{ $isActive := false }}
{{ range .RegularPages }}
{{ if eq .File.UniqueID $currentNode.File.UniqueID }}
{{ $isActive = true }}
{{ end }}
{{ end }}
<!-- current page is active or any sub-page is active -->
{{ $isActive := false }}
{{ range .RegularPages }}
{{ if eq .File.UniqueID $currentNode.File.UniqueID }}
{{ $isActive = true }}
{{ end }}
{{ end }}
{{ if eq .File.UniqueID $currentNode.File.UniqueID }}
{{ $isActive = true }}
{{ end }}
{{ $sectionLink := .Permalink }}
{{ $sectionLink := .Permalink }}
{{ if .Params.is_empty }}
{{ $sectionLink = (index (.RegularPages) 0).Permalink }}
{{ end }}
{{ if .Params.is_empty }}
{{ $sectionLink = (index (.RegularPages) 0).Permalink }}
{{ end }}
<details
class="docs-menu__links-group link-group {{ if $isActive }}active{{ end }}"
{{ if $isActive }}open{{ end }}
>
<summary class="docs-menu__links-group-heading">
<a href="{{ $sectionLink }}">
{{ .Title }}
</a>
</summary>
<details
class="docs-menu__links-group link-group {{ if $isActive }}active{{ end }}"
{{ if $isActive }}open{{ end }}
>
<summary class="docs-menu__links-group-heading">
<a href="{{ $sectionLink }}">
{{ .Title }}
</a>
</summary>
<nav>
<ul class="docs-menu__links-submenu">
{{ range .RegularPages }}
{{ if (eq .Params.type "external-link") }}
<li class="docs-menu__links-submenu-item">
<a href="{{ .Params.external_url }}" target="_blank">
{{ .Title }}
{{ partial "svg" "external-link.svg" }}
</a>
</li>
{{ else if not .Params.hideInSidebar }}
<li
class="docs-menu__links-submenu-item{{ if eq .File.UniqueID $currentNode.File.UniqueID }}
active
{{ end }}"
>
<a href="{{ .Permalink }}">{{ .Title }}</a>
</li>
<nav>
<ul class="docs-menu__links-submenu">
{{ range .RegularPages }}
{{ if (eq .Params.type "external-link") }}
<li class="docs-menu__links-submenu-item">
<a href="{{ .Params.external_url }}" target="_blank">
{{ .Title }}
{{ partial "svg" "external-link.svg" }}
</a>
</li>
{{ else if not .Params.hideInSidebar }}
<li
class="docs-menu__links-submenu-item{{ if eq .File.UniqueID $currentNode.File.UniqueID }}
active
{{ end }}"
>
<a href="{{ .Permalink }}">{{ .Title }}</a>
</li>
{{ end }}
{{ end }}
{{ end }}
</ul>
</nav>
</details>
</ul>
</nav>
</details>
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
</nav>
</nav>
{{ end }}
{{ if eq $currentNode.Section "articles" }}
<h3 class="docs-menu__links-title">Learn</h3>
<nav>
<div class="docs-menu__links-group">
{{ $subject := site.GetPage "articles" }}
{{ range $subject.Pages }}
{{ if .Params.isCategoryPage }}
<div
class="docs-menu__articles-link docs-menu__links-group-heading
{{ if eq .File.UniqueID $currentNode.File.UniqueID }} active{{ end }}"
>
<a href="{{ .Params.url }}">{{ .Params.title }}</a>
</div>
{{ end }}
{{ end }}
</div>
</nav>
{{ end }}
</div>
</div>
@@ -31,7 +31,7 @@
<script src="{{ $filterChartJs.RelPermalink }}"></script>
{{ end }}
{{ if in (slice "docs" "documentation") .Section }}
{{ if in (slice "docs" "documentation" "articles") .Section }}
{{ $documentationJs := resources.Get "/js/documentation.js" | js.Build | minify | resources.Fingerprint "sha512" }}
<script src="{{ $documentationJs.RelPermalink }}"></script>
{{ end }}
@@ -63,7 +63,7 @@
</script>
{{ end }}
{{ if or (in (slice "docs" "documentation") .Section) (and (not .IsPage) (eq .Section "blog")) }}
{{ if or (in (slice "docs" "documentation" "articles") .Section) (and (not .IsPage) (eq .Section "blog")) }}
{{ $pageSearchJs := resources.Get "/js/search/search.js" | js.Build | minify | resources.Fingerprint "sha512" }}
<script src="{{ $pageSearchJs.RelPermalink }}" type="module"></script>
{{ end }}
@@ -115,7 +115,7 @@
<script src="{{ $anchorJs.RelPermalink }}"></script>
{{ end }}
{{ if or (eq .Section "blog") (eq .Section "docs") (eq .Section "documentation") }}
{{ if or (eq .Section "blog") (eq .Section "docs") (eq .Section "documentation") (eq .Section "articles") }}
<script>
document.addEventListener('keydown', function (event) {
if ((event.metaKey || event.ctrlKey) && event.key === 'k') {
@@ -2,12 +2,17 @@
{{ if gt (.TableOfContents | len) 34 }}
<div class="table-of-contents">
<p class="table-of-contents__head">On this page:</p>
{{ .TableOfContents }}
{{ $tocStartLevel := .Params.toc_start_level }}
{{ if not $tocStartLevel }}
{{ $tocStartLevel = default 1 $.Parent.Params.toc_start_level }}
{{ end }}
{{ $tocEndLevel := default 3 .Params.toc_end_level }}
{{ $tocOrdered := false }}
{{ .Fragments.ToHTML $tocStartLevel $tocEndLevel $tocOrdered | safeHTML }}
<ul class="table-of-contents__external-links">
{{ if eq .Section "documentation" }}
{{ if or (eq .Section "documentation") (eq .Section "articles") }}
<li class="table-of-contents__link">
<a href="{{ .Site.Params.githubDocPrefix }}{{ path.Clean .File.Path }}" target="_blank">
{{ partial "svg" "github.svg" }}