# Αυτό-Hosted Vector Databases με Qdrant: Μια βαθιά κατάδυση

<datetime class="hidden">2025-11-23T13:00</datetime>

<!-- category -- ASP.NET, Semantic Search, Vector Databases, Qdrant, RAG, AI-Article -->
# Εισαγωγή

**Για τους σκοπούς του παρόντος κανονισμού, η Επιτροπή μπορεί να αποφασίσει να κινήσει τη διαδικασία που προβλέπεται στο άρθρο 107 παράγραφος 1 της Συνθήκης για τη λειτουργία της Ευρωπαϊκής Ένωσης, σύμφωνα με το άρθρο 108 παράγραφος 3 της Συνθήκης για τη λειτουργία της Ευρωπαϊκής Ένωσης και το άρθρο 108 παράγραφος 3 της Συνθήκης για τη λειτουργία της Ευρωπαϊκής Ένωσης.** Αυτό το άρθρο παρέχει μια βαθιά κατάδυση στο Qdrant, η διανυσματική βάση δεδομένων που χρησιμοποιείται σε:

- [Μέρος 4: Εφαρμογή ONNX & Qdrant](/blog/semantic-search-with-onnx-and-qdrant) - Κτήριο σημασιολογική αναζήτηση
- [Μέρος 5: Υβριδική Αναζήτηση & Auto-Indexing](/blog/rag-hybrid-search-and-indexing) - Ενσωμάτωση της παραγωγής

[QdrantCity name (optional, probably does not need a translation)](https://qdrant.tech/) Αυτό το άρθρο καλύπτει τις βασικές έννοιες, τον πελάτη C#, τον συντονισμό των επιδόσεων και τα πρότυπα παραγωγής.

[TOC]

# Τι είναι το Qdrant;

Α [Βάση δεδομένων διανυσματικών στοιχείων](https://qdrant.tech/documentation/overview/) Σε αντίθεση με τις παραδοσιακές βάσεις δεδομένων που βρίσκουν ακριβή ταίρια, το Qdrant βρίσκει *Σημασιολογικά παρόμοια* στοιχεία.

```mermaid
flowchart LR
    A[Text: 'Docker deployment'] --> B[Embedding Model]
    B --> C["Vector: [0.12, -0.34, 0.56, ...]"]
    C --> D[Qdrant]
    E[Query: 'container setup'] --> F[Embedding Model]
    F --> G["Vector: [0.11, -0.32, 0.58, ...]"]
    G --> H[Similarity Search]
    D --> H
    H --> I[Similar Results]

    style B stroke:#6366f1,stroke-width:3px
    style D stroke:#ef4444,stroke-width:3px
    style F stroke:#6366f1,stroke-width:3px
    style H stroke:#10b981,stroke-width:2px
```

**Βασικά χαρακτηριστικά του Qdrant:**

- [Δείκτης HNSW](https://qdrant.tech/documentation/concepts/indexing/) - Υπογραμμικοί χρόνοι αναζήτησης
- [Φίλτρο](https://qdrant.tech/documentation/concepts/filtering/) - Συνδυάστε αναζήτηση ομοιότητας με φίλτρα μεταδεδομένα
- [gRPC & REST APIs](https://qdrant.tech/documentation/interfaces/) - Υψηλής απόδοσης πρόσβαση
- [Κατανεμημένη ανάπτυξη](https://qdrant.tech/documentation/guides/distributed_deployment/) - Κλιμάκωση οριζόντια
- [Στιγμιότυπα](https://qdrant.tech/documentation/concepts/snapshots/) - Backup και αποκατάσταση

# Βασικές έννοιες

## Συλλογές

Α [συλλογή](https://qdrant.tech/documentation/concepts/collections/) είναι σαν έναν πίνακα - κρατά φορείς με σταθερή διάσταση και μέτρηση απόστασης.

```mermaid
flowchart TB
    subgraph Collection["Collection: blog_posts"]
        A[Vector Size: 384]
        B[Distance: Cosine]
        C[HNSW Index]
    end

    subgraph Points
        D[Point 1: slug=docker-intro]
        E[Point 2: slug=kubernetes-basics]
        F[Point N...]
    end

    Collection --> Points

    style A stroke:#6366f1,stroke-width:2px
    style B stroke:#6366f1,stroke-width:2px
    style C stroke:#f59e0b,stroke-width:2px
    style D stroke:#10b981,stroke-width:2px
    style E stroke:#10b981,stroke-width:2px
```

```csharp
// Create collection - see https://qdrant.tech/documentation/concepts/collections/#create-a-collection
await client.CreateCollectionAsync(
    collectionName: "blog_posts",
    vectorsConfig: new VectorParams
    {
        Size = 384,              // Must match your embedding model
        Distance = Distance.Cosine  // Best for text embeddings
    }
);
```

**Μετρητές απόστασης** ([Γιατροί](https://qdrant.tech/documentation/concepts/collections/#distance-metrics)):

- **ΣυνημίτοναCity name (optional, probably does not need a translation)** - Μετρά γωνία μεταξύ διανυσμάτων (καλύτερο για κείμενο)
- **Τελεία** - Ακατέργαστο εσωτερικό προϊόν (για προ-κανονισμένους φορείς)
- **ΕυκλείδηCity name (optional, probably does not need a translation)** - Γεωμετρική απόσταση (για χωρικά δεδομένα)

## Σημεία

Α [σημείο](https://qdrant.tech/documentation/concepts/points/) είναι μία μόνο εγγραφή που περιέχει:

```mermaid
flowchart LR
    subgraph Point
        A[ID: uuid/int]
        B["Vector: float[384]"]
        C[Payload: JSON metadata]
    end

    style A stroke:#8b5cf6,stroke-width:2px
    style B stroke:#f59e0b,stroke-width:2px
    style C stroke:#10b981,stroke-width:2px
```

```csharp
// Upsert points - see https://qdrant.tech/documentation/concepts/points/#upload-points
var point = new PointStruct
{
    Id = new PointId { Uuid = Guid.NewGuid().ToString() },
    Vectors = embedding,  // float[384]
    Payload =
    {
        ["slug"] = "my-post",
        ["title"] = "Vector Databases",
        ["language"] = "en",
        ["categories"] = new[] { "AI", "Databases" },
        ["published"] = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
    }
};

await client.UpsertAsync("blog_posts", points: new[] { point });
```

## Φίλτρο

[Φίλτρο](https://qdrant.tech/documentation/concepts/filtering/) τρέξιμο *πριν* αναζήτηση ομοιότητας - εξαιρετικά αποτελεσματική.

```mermaid
flowchart TB
    A[Search Query] --> B{Apply Filters First}
    B --> C[Language = 'en']
    B --> D[Year >= 2024]
    C --> E[Filtered Subset]
    D --> E
    E --> F[Vector Similarity Search]
    F --> G[Ranked Results]

    style B stroke:#ec4899,stroke-width:3px
    style E stroke:#f59e0b,stroke-width:2px
    style F stroke:#6366f1,stroke-width:2px
    style G stroke:#10b981,stroke-width:2px
```

```csharp
// Filter conditions - see https://qdrant.tech/documentation/concepts/filtering/#filtering-conditions
var filter = new Filter
{
    Must =  // AND conditions
    {
        new Condition { Field = new FieldCondition
        {
            Key = "language",
            Match = new Match { Keyword = "en" }
        }},
        new Condition { Field = new FieldCondition
        {
            Key = "published",
            Range = new Range { Gte = 1704067200 }  // 2024-01-01
        }}
    },
    MustNot =  // Exclude conditions
    {
        new Condition { Field = new FieldCondition
        {
            Key = "slug",
            Match = new Match { Keyword = "draft-post" }
        }}
    }
};
```

**Τύποι φίλτρων** ([Γιατροί](https://qdrant.tech/documentation/concepts/filtering/#match)):

- `Match.Keyword` - Ακριβώς ταίριασμα συμβολοσειράς.
- `Match.Text` - Ταίριασμα πλήρους κειμένου
- `Match.Any` - Ταιριάζει με οποιαδήποτε σειρά
- `Range` - Αριθμητικά όρια (Gte, Lte, Gt, Lt)
- `GeoBoundingBox` / `GeoRadius` - Γεωφιλτράρισμα

# Πελάτης C#

Εγκατάσταση του υπαλλήλου [Qdrant. Πελάτης](https://www.nuget.org/packages/Qdrant.Client) συσκευασία ([GitHubCity name (optional, probably does not need a translation)](https://github.com/qdrant/qdrant-dotnet)):

```bash
dotnet add package Qdrant.Client
```

## Ρύθμιση σύνδεσης

```csharp
using Qdrant.Client;
using Qdrant.Client.Grpc;

// gRPC client (recommended) - see https://qdrant.tech/documentation/interfaces/#grpc-interface
var client = new QdrantClient(
    host: "localhost",
    port: 6334,  // gRPC port (6333 is REST)
    https: false
);

// With API key - see https://qdrant.tech/documentation/guides/security/
var secureClient = new QdrantClient(
    host: "your-qdrant.cloud",
    port: 6334,
    https: true,
    apiKey: "your-api-key"
);
```

> **Πάντοτε να χρησιμοποιείτε gRPC** (port 6334) για την παραγωγή - 3-5x γρηγορότερα από REST.

## Επιδιόρθωση Windows HTTP/2

Στα Windows, ενεργοποιήστε το μη κρυπτογραφημένο HTTP/2 **πριν** δημιουργία του πελάτη:

```csharp
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
```

## Βασικές πράξεις

### Αναζήτηση

```csharp
// Vector search - see https://qdrant.tech/documentation/concepts/search/
var results = await client.SearchAsync(
    collectionName: "blog_posts",
    vector: queryEmbedding,
    limit: 10,
    filter: filter,
    scoreThreshold: 0.5f,  // Minimum similarity
    searchParams: new SearchParams
    {
        HnswEf = 128,  // Search accuracy (higher = better recall)
        Exact = false  // Use approximate search
    },
    withPayload: true
);

foreach (var result in results)
{
    Console.WriteLine($"{result.Payload["title"].StringValue}: {result.Score}");
}
```

### Παρτίδα Upsert

```csharp
// Batch operations - see https://qdrant.tech/documentation/concepts/points/#batch-update
var points = documents.Select(doc => new PointStruct
{
    Id = new PointId { Uuid = doc.Id },
    Vectors = doc.Embedding,
    Payload = { ["slug"] = doc.Slug, ["title"] = doc.Title }
}).ToList();

await client.UpsertAsync(
    collectionName: "blog_posts",
    points: points,
    wait: true  // Wait for indexing
);
```

### Διαγραφή

```csharp
// Delete by filter - see https://qdrant.tech/documentation/concepts/points/#delete-points
await client.DeleteAsync(
    collectionName: "blog_posts",
    filter: new Filter
    {
        Must = { new Condition { Field = new FieldCondition
        {
            Key = "slug",
            Match = new Match { Keyword = "old-post" }
        }}}
    }
);
```

# Συντονισμός του δείκτη HNSW

[HNSWCity name (optional, probably does not need a translation)](https://qdrant.tech/documentation/concepts/indexing/#vector-index) (Hierarchical Navigable Small World) είναι ο αλγόριθμος ευρετηρίου του Qdrant.

```mermaid
flowchart TB
    subgraph "HNSW Graph Layers"
        L2[Layer 2 - Sparse]
        L1[Layer 1 - Medium]
        L0[Layer 0 - Dense]
    end

    Q[Query] --> L2
    L2 --> L1
    L1 --> L0
    L0 --> R[Nearest Neighbors]

    style L2 stroke:#8b5cf6,stroke-width:2px
    style L1 stroke:#6366f1,stroke-width:2px
    style L0 stroke:#3b82f6,stroke-width:2px
    style Q stroke:#10b981,stroke-width:2px
    style R stroke:#ef4444,stroke-width:2px
```

## Παράμετροι ευρετηρίου

```csharp
// HNSW config - see https://qdrant.tech/documentation/concepts/indexing/#hnsw-index
var hnswConfig = new HnswConfigDiff
{
    M = 16,              // Edges per node (16-32 recommended)
    EfConstruct = 100,   // Build-time accuracy (100-200)
    FullScanThreshold = 10000  // Brute force threshold
};

await client.UpdateCollectionAsync(
    collectionName: "blog_posts",
    hnswConfig: hnswConfig
);
```

**Ακρίβεια χρόνου αναζήτησης:**

```csharp
var searchParams = new SearchParams
{
    HnswEf = 128  // Higher = better recall, slower (64-256)
};
```

**Κατευθυντήριες γραμμές συντονισμού:**
Χρησιμοποίησε την υπόθεση M EfConstruct HnswEf
|----------|---|-------------|--------|
Γρήγορη, χαμηλή ανάμνηση 8 64 32
Ισορροπημένος 16 100 128
Υψηλή ανάμνηση 32 00 00 00 00 00: 256 00: 00: 00: 00: 00: 00: 00: 00: 00, 00: 00: 00: 00: 00, 00: 00: 00: 00: 00: 00, 00: 00: 00: 00: 00: 00: 00: 00, 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00: 00 00 00 00 00 00: 00: 00: 00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

# Δείκτες πληρωμής

Δημιουργία [Δείκτες φορτίου](https://qdrant.tech/documentation/concepts/indexing/#payload-index) για συχνά φιλτραρισμένα πεδία:

```csharp
// Keyword index - see https://qdrant.tech/documentation/concepts/indexing/#payload-index
await client.CreatePayloadIndexAsync(
    collectionName: "blog_posts",
    fieldName: "language",
    schemaType: PayloadSchemaType.Keyword
);

// Integer index for ranges
await client.CreatePayloadIndexAsync(
    collectionName: "blog_posts",
    fieldName: "published",
    schemaType: PayloadSchemaType.Integer
);
```

**Αντίκτυπος:** 100-100x γρηγορότερο φιλτράρισμα σε μεγάλες συλλογές.

# Ποσοτικοποίηση

[Ποσοτικοποίηση](https://qdrant.tech/documentation/guides/quantization/) μειώνει τη χρήση μνήμης:

```csharp
// Scalar quantization - see https://qdrant.tech/documentation/guides/quantization/#scalar-quantization
await client.UpdateCollectionAsync(
    collectionName: "blog_posts",
    quantizationConfig: new ScalarQuantization
    {
        Scalar = new ScalarQuantizationConfig
        {
            Type = ScalarType.Int8,  // float32 -> int8
            Quantile = 0.99f,
            AlwaysRam = true
        }
    }
);
```

**Ανταλλαγές:** 4x λιγότερη μνήμη, ~2% απώλεια ανάκλησης, 1.5x ταχύτερη αναζήτηση.

# Docker Development

```yaml
# docker-compose.yml - see https://qdrant.tech/documentation/guides/installation/
services:
  qdrant:
    image: qdrant/qdrant:v1.12.1  # Pin version!
    ports:
      - "6333:6333"  # REST
      - "6334:6334"  # gRPC
    volumes:
      - qdrant_data:/qdrant/storage
    environment:
      - QDRANT__SERVICE__GRPC_PORT=6334
      - QDRANT__SERVICE__HTTP_PORT=6333
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:6333/health"]
      interval: 30s
      timeout: 10s
      retries: 3

volumes:
  qdrant_data:
```

## Ασφάλεια

Ενεργοποίηση [Ταυτοποίηση κλειδιού API](https://qdrant.tech/documentation/guides/security/):

```yaml
environment:
  - QDRANT__SERVICE__API_KEY=your-secret-key
```

# Παρακολούθηση

## Μετρικός

Εκτίθεται το Qdrant [Προμηθέας μετρικές](https://qdrant.tech/documentation/guides/monitoring/) σε `/metrics`:

```bash
curl http://localhost:6333/metrics
```

Μετρητές κλειδιών:

- `qdrant_collections_vector_count` - Σύνολο διανυσμάτων
- `qdrant_rest_responses_duration_seconds` - Ερώτηση αργοπορίας
- `qdrant_memory_usage_bytes` - Κατανάλωση μνήμης

## Στιγμιότυπα

Δημιουργία [backups@ info: whatsthis](https://qdrant.tech/documentation/concepts/snapshots/):

```bash
# Create snapshot
curl -X POST http://localhost:6333/collections/blog_posts/snapshots

# List snapshots
curl http://localhost:6333/collections/blog_posts/snapshots

# Restore (copy snapshot to storage/collections/blog_posts/snapshots/)
```

# Συχνές ΓκόταςCity name (optional, probably does not need a translation)

## 1. Σύγχυση λιμένων

- **6333** = REST API
- **6334** = gRPC API (χρησιμοποίησε αυτό!)

## 2. Αστοχία διάνυσμα

```
Error: expected dim: 384, got 768
```

Το μοντέλο και η συλλογή σας πρέπει να ταιριάζουν:

- `all-MiniLM-L6-v2`: 384 διαστάσεις
- `nomic-embed-text`: 768 διαστάσεις
- OpenAI `text-embedding-3-small`: 1536 διαστάσεις

## 3. Αργή πρώτη ερώτηση

HNSW τεμπέληδες-loads στη μνήμη. Ζέστανε μετά την εκκίνηση:

```csharp
await client.SearchAsync("blog_posts", new float[384], limit: 1);
```

## 4. Φίλτρο σχεδίασης

Χρήση `Match.Any` για πεδία σειράς:

```csharp
new Match { Any = new RepeatedStrings { Strings = { "AI", "ML" } } }
```

# Πόροι

## Επίσημη τεκμηρίωση Qdrant

- [Επισκόπηση](https://qdrant.tech/documentation/overview/) - Ξεκινάμε.
- [Έννοιες](https://qdrant.tech/documentation/concepts/) - Βασικές έννοιες
- [Συλλογές](https://qdrant.tech/documentation/concepts/collections/) - Δημιουργία και διαχείριση συλλογών
- [Σημεία](https://qdrant.tech/documentation/concepts/points/) - Δουλεύοντας με φορείς
- [Αναζήτηση](https://qdrant.tech/documentation/concepts/search/) - Ερωτηματολόγια
- [Φίλτρο](https://qdrant.tech/documentation/concepts/filtering/) - Συνθήκες φίλτρου
- [Ευρεσιτεχνία](https://qdrant.tech/documentation/concepts/indexing/) - Δείκτης HNSW και ωφέλιμο φορτίο
- [Ποσοτικοποίηση](https://qdrant.tech/documentation/guides/quantization/) - Βελτιστοποίηση μνήμης
- [Ασφάλεια](https://qdrant.tech/documentation/guides/security/) - Αυθεντικότητα
- [Παρακολούθηση](https://qdrant.tech/documentation/guides/monitoring/) - Μετρική και τηλεμετρία
- [Στιγμιότυπα](https://qdrant.tech/documentation/concepts/snapshots/) - Backup και αποκατάσταση

## Βιβλιοθήκες πελατών

- [Qdrant .NET Πελάτης](https://github.com/qdrant/qdrant-dotnet) - Επίσημη C# SDK
- [NuGet Package](https://www.nuget.org/packages/Qdrant.Client) - Τελευταία απελευθέρωση.

## Σχετικά άρθρα

- [Μέρος 4: Εφαρμογή ONNX & Qdrant](/blog/semantic-search-with-onnx-and-qdrant)
- [Μέρος 5: Υβριδική Αναζήτηση & Auto-Indexing](/blog/rag-hybrid-search-and-indexing)
- [Επισκόπηση σειράς RAG](/blog/rag-primer)

## Πηγαίος κώδικας

Όλος ο διαθέσιμος κωδικός στη διεύθυνση: [github.com/scottgal/κυρίως διαυγής ιστός](https://github.com/scottgal/mostlylucidweb)

- `Mostlylucid.SemanticSearch/Services/QdrantVectorStoreService.cs` - Ενσωμάτωση Qdrant