Qdrant: Căutare Semantică & Filtre de Payload Avansate în Baze de Date Vectoriale & Căutare Semantică

Interogarea vectorilor cu clauze logice complexe (Filter, FieldCondition, MatchValue, Range) aplicate direct în timpul navigării grafului HNSW.

Sintaxă & interogare
rezultate = client.search(
    collection_name="articole_dexblog",
    query_vector=vector_intrebare,
    query_filter=models.Filter(
        must=[
            models.FieldCondition(key="categorie", match=models.MatchValue(value="devops")),
            models.FieldCondition(key="an", range=models.Range(gte=2025))
        ]
    ),
    limit=5
)

Descriere & Utilizare

Cea mai mare provocare în sistemele RAG din lumea reală este combinarea căutării semantice cu reguli de afaceri stricte (de exemplu: „Găsește cele mai relevante proceduri, dar numai cele din departamentul HR și actualizate după 2024”).

Qdrant excelează la acest capitol prin mecanismul său de Single-stage Filtering: filtrele nu sunt aplicate după căutare (post-filtering, care poate goli rezultatele) și nici înainte (pre-filtering, care distruge graful), ci în timpul explorării HNSW, păstrând întotdeauna numărul dorit de rezultate.

Poți construi condiții logice oricât de complexe combinând clauzele must (AND), should (OR), must_not (NOT) cu potriviri exacte, verificări de intervale numerice (Range) sau căutare de prefixe text.

Cum să o reții ușor

💡 Ca un agent imobiliar căruia îi ceri o casă cu o atmosferă primitoare (vector search), dar pui condiția fermă să aibă minim 3 camere și să fie sub un anumit preț (payload filter).

Opțiuni și parametri tehnici

  • query_vector: vectorul generat pentru întrebarea utilizatorului.
  • query_filter: instanță models.Filter(must=[...], should=[...]).
  • limit: numărul de rezultate returnate (Top K, ex: 5).
  • score_threshold: scorul minim de similitudine sub care rezultatele sunt ignorate (ex: 0.75).
  • with_payload=True: returnează și metadatele asociate fiecărui rezultat.

Exemple practice și cazuri de utilizare

  • Crearea unui index pe câmpul de filtrare pentru viteză: client.create_payload_index(collection_name="...", field_name="categorie", field_schema="keyword").
  • Parcurgerea rezultatelor: for r in rezultate: print(f"{r.score:.3f} | {r.payload['titlu']}").
  • Filtru pe liste de etichete (MatchAny): models.FieldCondition(key="tags", match=models.MatchAny(any=["ai", "docker"])).

Sfaturi de configurare & capcane

Dacă filtrezi des după un anumit câmp (de exemplu user_id sau categorie), creează un Payload Index cu create_payload_index() — interogările filtrate vor deveni de 10 ori mai rapide!

Comenzi și ghiduri înrudite