# Diagnosis
## Symptom
`index.query(...)` returns 200 with an empty `matches` list, on data you believe is indexed.
## Likely cause
Almost always one of: wrong namespace, an over-strict metadata filter, querying an empty or different index, or a garbage query vector (e.g. all zeros).
## Confirm it
1. `describe_index_stats()` , is `total_vector_count` nonzero, and does the namespace you queried have vectors?
2. Re-run the query with no `filter` and no namespace. If matches appear, the filter or namespace was wrong.
3. Fetch one known id with `fetch` , if fetch finds it but query does not, the query vector or filter is the problem.
4. Print the query vector: all zeros or NaNs mean the embedding step failed silently.
## Fix
1. Namespace mismatch: pass the ingest namespace on the query.
2. Filter too strict: loosen or drop clauses until matches return, then re-tighten.
3. Empty index: the ingest never ran or targeted another index; re-ingest.
4. Bad query vector: fix the embedding call (model load, API key, truncation).
## Verify the fix
Re-run the original query and assert `len(matches) > 0`. Then re-add the filter one clause at a time to find the clause that killed results.