docs/components/vectordbs/dbs/oracledb.mdx
Oracle AI Vector Search stores embeddings in an Oracle table using the native VECTOR data type, so you can combine semantic search over unstructured data with relational queries over business data in a single database.
python-oracledb or node-oracledb driver. In thick mode, Oracle Client 23.4 or later is also required.npm install oracledb
os.environ["OPENAI_API_KEY"] = "sk-xx"
config = { "vector_store": { "provider": "oracledb", "config": { "collection_name": "mem0", "embedding_model_dims": 1536, "connection_params": { "user": "mem0_user", "password": "your-password", "dsn": "localhost:1521/FREEPDB1", }, } } }
m = Memory.from_config(config) messages = [ {"role": "user", "content": "I'm planning to watch a movie tonight. Any recommendations?"}, {"role": "assistant", "content": "How about thriller movies? They can be quite engaging."}, {"role": "user", "content": "I'm not a big fan of thriller movies but I love sci-fi movies."}, {"role": "assistant", "content": "Got it! I'll avoid thriller recommendations and suggest sci-fi movies in the future."} ] m.add(messages, user_id="alice", metadata={"category": "movies"})
```typescript TypeScript
import { Memory } from "mem0ai/oss";
const config = {
vectorStore: {
provider: "oracledb",
config: {
collectionName: "mem0",
embeddingModelDims: 1536,
connectionParams: {
user: "mem0_user",
password: "your-password",
connectString: "localhost:1521/FREEPDB1",
},
},
},
};
const memory = new Memory(config);
const messages = [
{
role: "user",
content: "I'm planning to watch a movie tonight. Any recommendations?",
},
{
role: "assistant",
content: "How about thriller movies? They can be quite engaging.",
},
{
role: "user",
content: "I'm not a big fan of thriller movies but I love sci-fi movies.",
},
{
role: "assistant",
content:
"Got it! I'll avoid thriller recommendations and suggest sci-fi movies in the future.",
},
];
await memory.add(messages, {
userId: "alice",
metadata: { category: "movies" },
});
To reuse a connection or pool you already manage, pass it as client instead of the connection parameters:
pool = oracledb.create_pool(user="mem0_user", password="your-password", dsn="localhost:1521/FREEPDB1")
config = { "vector_store": { "provider": "oracledb", "config": {"client": pool}, } }
```typescript TypeScript
import oracledb from "oracledb";
const pool = await oracledb.createPool({
user: "mem0_user",
password: "your-password",
connectString: "localhost:1521/FREEPDB1",
});
const config = {
vectorStore: {
provider: "oracledb",
config: { client: pool },
},
};
Here are the parameters available for configuring Oracle AI Vector Search:
| Python | TypeScript | Description | Default Value |
|---|---|---|---|
connection_params | connectionParams | Connection settings passed to the Oracle driver, such as user, password and dsn (connectString in TypeScript). See the Python or Node.js connection handling guide. | None |
use_connection_pool | useConnectionPool | Create a connection pool from the connection parameters instead of a single connection | True |
client | client | An existing Oracle connection or pool to use instead of building one from the connection parameters | None |
collection_name | collectionName | Name of the Oracle table that stores vectors and payloads | mem0 |
embedding_model_dims | embeddingModelDims | Dimension of your embedding vectors, must be greater than 0 | 1536 |
distance_metric | distanceMetric | Distance function used for indexing and search: COSINE, EUCLIDEAN, EUCLIDEAN_SQUARED, DOT, HAMMING or MANHATTAN | COSINE |
do_create_index | doCreateIndex | Whether to create a vector index on the collection | True |
index_type | indexType | Vector index type: HNSW or IVF | HNSW |
index_name | indexName | Name of the vector index | <collection_name>_VEC_IDX |
index_parameters | indexParameters | Index tuning parameters. For HNSW: neighbors, efconstruction. For IVF: neighbor partitions, samples_per_partition, min_vectors_per_partition. | None |
index_accuracy | indexAccuracy | Target index accuracy from 1 to 100, applied as WITH TARGET ACCURACY <n> | None |
Set the index type with index_type and tune it with index_parameters:
const config = {
vectorStore: {
provider: "oracledb",
config: {
connectionParams: {
user: "mem0_user",
password: "your-password",
connectString: "localhost:1521/FREEPDB1",
},
indexType: "HNSW",
indexParameters: { neighbors: 32, efconstruction: 200 },
indexAccuracy: 95,
},
},
};
For the full list of supported options, see the Oracle CREATE VECTOR INDEX reference.
Oracle returns a distance from VECTOR_DISTANCE, which Mem0 converts to a score where higher means more similar. COSINE and the other non-negative metrics produce scores in the range [0, 1]. DOT returns the inner product, which can fall outside that range.
Filters run against the JSON payload column and support:
| Filter type | Examples |
|---|---|
| Scalar equality | {"user_id": "alice"} |
| Field existence | {"agent_id": "*"} |
| Comparison | {"score": {"gte": 0.5}}, also eq, ne, gt, lt, lte |
| Membership | {"category": {"in": ["movies", "books"]}}, also nin |
| String matching | {"title": {"contains": "sci-fi"}}, also icontains for case-insensitive |
| Logical groups | {"AND": [...]}, {"OR": [...]}, {"NOT": [...]}, also $and, $or, $not |
Multiple fields at the top level are combined with AND:
await memory.search("movie recommendations", {
userId: "alice",
filters: { category: { in: ["movies", "books"] }, rating: { gte: 4 } },
});