Skip to content

Hybrid search and FTS

Prefer includeVector: false when you do not need result embeddings (lower latency and GC alloc). Default remains true for backward compatibility.

Single vector

var hits = col.Query(
    new ZVecQuery { FieldName = "vec", Vector = myVec },
    topk: 10,
    includeVector: false);

Full-text (FTS)

var hits = col.Query(
    new ZVecQuery
    {
        FieldName = "content",
        Fts = new ZVecFtsQuery { QueryString = "search terms" }
    },
    topk: 10,
    includeVector: false);

Multi-vector + RRF (requires ≥ 2 sub-queries)

var hits = col.Query(
    [
        new ZVecQuery { FieldName = "title_vec", Vector = titleVec },
        new ZVecQuery { FieldName = "body_vec", Vector = bodyVec }
    ],
    topk: 10,
    reranker: new ZVecRrfReranker { TopN = 10 },
    includeVector: false);

Hybrid (dense + sparse) + filter + RRF

var denseQ = new ZVecQuery { FieldName = "vector1", Vector = dense };
var sparseQ = new ZVecQuery
{
    FieldName = "sparse1",
    SparseVector = new Dictionary<int, float> { [0] = 1.0f, [3] = 0.5f }
};
var filter = ZVecFilterBuilder.Create()
    .Where("category", ZVecCompareOp.Eq, "demo");
var hits = col.Query(
    [denseQ, sparseQ],
    topk: 5,
    reranker: new ZVecRrfReranker { TopN = 5 },
    filter: filter,
    includeVector: false);

Dense + FTS + weighted rerank

var hits = col.Query(
    [
        new ZVecQuery { FieldName = "vec", Vector = dense },
        new ZVecQuery
        {
            FieldName = "content",
            Fts = new ZVecFtsQuery { QueryString = "zvec maui" }
        }
    ],
    topk: 10,
    reranker: new ZVecWeightedReranker
    {
        TopN = 10,
        Weights = new Dictionary<string, float>
        {
            ["vec"] = 0.7f,
            ["content"] = 0.3f
        }
    },
    includeVector: false);

Filter builder (dynamic)

var filter = ZVecFilterBuilder.Create()
    .Where("publish_year", ZVecCompareOp.Gt, 2020)
    .And(f => f
        .Where("category", ZVecCompareOp.Eq, "fiction")
        .Or(g => g.ContainAny("tags", "AI", "ML")))
    .Build();

Group-by

QueryGroupBy / QueryGroupByAsync remain not executable (NotSupportedException). Python uses pybind11 → C++; the official C API has no zvec_collection_group_by_query. Details: Native API coverage.

Theory / product docs