🔎Basic Search

The simplest way is to call the search API directly, which performs all three steps of a full search in a single call:

  1. Scoring – compute similarity scores in ciphertext

  2. Decryption – decrypt the score vector locally on the client

  3. Metadata retrieval – request the top-k metadata entries mapped to the scores

Note: Decryption is always performed on the client side with the secret key. This ensures true end-to-end encryption, meaning sensitive data is never exposed to the server.

import pyenvector as ev
import numpy as np

# Prepare normalized data
vecs = np.random.rand(100, 512)
vecs = vecs / np.linalg.norm(vecs, axis=1, keepdims=True)

# Initialize and insert
ev.init(address="localhost:50050", key_path="keys", key_id="example")
index = ev.create_index("example_index", dim=512)
metadata = [f"metadata_{i}" for i in range(100)]
index.insert(vecs, metadata)

# Perform search with a single query
search_index = ev.Index("example_index")
query = vecs[0]
result = search_index.search(query, top_k=2, output_fields=["metadata"])[0]

print(result)
# [{'id': 1, 'score': 0.9999, 'metadata': 'metadata_0'},
#  {'id': 59, 'score': 0.7888, 'metadata': 'metadata_58'}]

You can also search with multiple queries at once by providing a 2D numpy array. The results will be returned as a list, where each element corresponds to the result set of one query.

Last updated