Member Junction
    Preparing search index...

    MemberJunction vector database provider backed by PostgreSQL with the pgvector extension.

    How it works: Each logical "index" is represented as a PostgreSQL table with three columns: id (TEXT primary key), embedding (pgvector VECTOR(N) column), and metadata (JSONB). An internal registry table (_mj_vector_indexes) tracks all indexes created by this provider along with their dimension and distance metric.

    On first use, the provider auto-creates the vector extension, the configured schema, and the registry table. Each new index gets an HNSW index for fast approximate nearest-neighbor search and a GIN index on the metadata column for efficient JSONB filtering.

    Connection: Supply a JSON connection string as the apiKey constructor parameter, or configure individual fields via environment variables (PG_VECTOR_HOST, PG_VECTOR_PORT, etc.). If the apiKey is not valid JSON it is treated as a plain password with all other values sourced from environment variables.

    Distance metrics: Supports cosine (default, <=>), euclidean (<->), and dotproduct (<#>).

    Registered with the MJ class factory as 'PgVectorDatabase'.

    Hierarchy (View Summary)

    Index

    Constructors

    Properties

    ColocatedHost: IColocatedVectorHost

    The host relational connection a colocated provider borrows to store and query vectors in the same database as the application's entity data. undefined until SetColocatedHost (or TryWireColocatedHost) is called.

    Accessors

    • get ApiKey(): string

      Only sub-classes can access the API key

      Returns string

    • get IsReadOnly(): boolean

      True when this driver does not accept ingestion via CreateRecord(s) / UpdateRecord(s) — implies vectors are managed out-of-band (e.g. SimpleVectorServiceProvider reads embeddings directly from MJ: Entity Record Documents.VectorJSON). Pipelines that would otherwise call ingestion APIs should short-circuit when this is true to avoid spurious "unsupported" error logs.

      Subclasses that genuinely support ingestion leave the default false.

      Returns boolean

    • get QueryKeyIsEntityDocumentID(): boolean

      Whether this provider's QueryIndex/HybridQuery params.id is the EntityDocumentID (a GUID) rather than an external/logical index name. External services (Pinecone, Qdrant) and DB-colocated providers key by an index name and return false (the default). The in-process SimpleVectorServiceProvider reads vectors out of MJ: Entity Record Documents keyed by EntityDocumentID, so it overrides this to true.

      Callers that hold both identifiers (e.g. the duplicate-record detector) consult this to pass the correct id for the resolved provider instead of assuming index-name semantics.

      Returns boolean

    • get RequiresAPIKey(): boolean

      Whether this provider requires an API key / credential to operate. Defaults to true for external, cloud-hosted vector services (Pinecone, Qdrant, …). Override and return false for in-process / local providers that authenticate via the host process or the application's own database rather than a remote credential — e.g. the in-memory SimpleVectorServiceProvider, which reads vectors out of MJ: Entity Record Documents.VectorJSON and never calls an external service.

      Callers that gate on a missing key (e.g. the Entity Vector Sync pipeline and the duplicate-record detector) consult this so a keyless local provider isn't rejected with a spurious "No API Key found" error.

      Returns boolean

    • get SupportsColocatedQuery(): boolean

      Whether this provider stores vectors inside the application's relational database and can resolve query results to entity records without an external mapping hop. Override and return true in colocated providers (e.g. PgVectorColocated, SQLServerVectorDatabase).

      Returns boolean

    • get SupportsHybridSearch(): boolean

      Whether this provider supports hybrid (vector + full-text) search.

      Currently returns false. While pgvector combined with PostgreSQL's tsvector/pg_trgm could support hybrid search, this is not implemented in the initial release.

      Returns boolean

    Methods

    • Build a pgvector-native metadata filter from the shared SharedIndexFilterOptions interface used across all MJ vector providers.

      The shared filter options (EntityName, RecordIDs, etc.) are first converted to generic MetadataFilterCondition objects via VectorMetadataFilter.BuildConditions, then wrapped in an internal _pgvectorConditions envelope that the private BuildFilterClause helper translates into parameterized SQL WHERE clauses.

      Parameters

      Returns object

      An opaque filter object to pass as QueryOptions.filter, or undefined if the options produce no conditions.

    • Build per-record routing and operational directives for this provider.

      Called by the generic sync pipeline once per source database row, before the VectorRecord is constructed. The returned object is stored on VectorRecord.providerTemporaryDirectives and passed to CreateRecords alongside the stored metadata — but is never itself persisted in the vector index.

      Providers override this to extract whatever routing values they need from providerConfig (the parsed VectorIndex.ProviderConfig JSON) and from sourceRecord (the raw database row). Example: the Pinecone driver reads providerConfig.namespaceField, looks up the corresponding value in sourceRecord, and returns { namespace: '<orgId>' } so CreateRecords can route each vector to the correct Pinecone namespace without embedding org data in the stored metadata.

      The default implementation returns an empty object — providers that do not need per-record routing need not override this method.

      Parameters

      • _sourceRecord: Record<string, unknown>

        The raw database row being vectorized.

      • _providerConfig: Record<string, unknown>

        The parsed VectorIndex.ProviderConfig JSON blob.

      Returns Record<string, unknown>

      An opaque key/value map consumed by this provider's CreateRecord(s).

    • Create a new vector index backed by a PostgreSQL table.

      This method:

      1. Creates a table with id, embedding, and metadata columns.
      2. Creates an HNSW index on the embedding column using the appropriate operator class for the requested distance metric.
      3. Creates a GIN index on the metadata JSONB column.
      4. Registers the index in the internal registry table.

      If the table or indexes already exist they are left untouched (IF NOT EXISTS).

      Parameters

      • params: CreateIndexParams

        Index creation parameters including id (table name), dimension (vector size), and optional metric (defaults to 'cosine').

      Returns Promise<BaseResponse>

      A BaseResponse with data containing the created index metadata on success, or a failure response on error.

      Never throws; errors are caught and returned as a failure response.

    • Insert or update multiple vector records in the specified index.

      Uses a transactional batch of INSERT ... ON CONFLICT DO UPDATE statements so that existing records are overwritten atomically.

      Parameters

      • records: VectorRecord[]

        Array of vector records to upsert.

      • OptionalindexName: string

        The target index (table) name. Required.

      Returns Promise<BaseResponse>

      A BaseResponse with data.upsertedCount on success, or a failure response on error.

      Never throws; errors are caught and returned as a failure response.

    • Delete all records from an index. Executes an unqualified DELETE FROM on the underlying table, leaving the table structure and indexes intact.

      Parameters

      • indexName: string

        The target index (table) name.

      • Optional_namespace: string

        Ignored; pgvector does not use namespaces.

      Returns Promise<BaseResponse>

      A BaseResponse indicating success or failure.

      Never throws; errors are caught and returned as a failure response.

    • List vector record IDs with optional metadata filtering and cursor-based pagination.

      Results are ordered by id and paginated using an integer offset encoded as a string token. When the returned array contains fewer items than Limit, there are no more pages.

      Parameters

      • params: ListVectorIDsParams

        Parameters including IndexName, optional Limit (default 100), optional PaginationToken (stringified offset), and optional MetadataFilter (key-value pairs matched against the JSONB metadata column).

      Returns Promise<ListVectorIDsResult>

      A ListVectorIDsResult with the matching IDs and an optional NextPaginationToken for the next page.

      Never throws; errors are caught and an empty result is returned.

    • Perform an approximate nearest-neighbor search against a vector index.

      The query vector is compared against all embeddings in the target table using the distance operator associated with the index's metric. Results are ordered by ascending distance and limited to topK rows. Distance values are converted to similarity scores before being returned.

      Optional metadata filters are translated into parameterized WHERE clauses against the JSONB metadata column.

      Parameters

      • params: QueryOptions

        Query options including:

        • vector (number[]) -- the query embedding (required).
        • id (string) -- the index (table) name (required).
        • topK (number) -- maximum results to return (default 10).
        • includeMetadata (boolean) -- include metadata in results (default true).
        • includeValues (boolean) -- include raw vectors in results (default false).
        • filter (object) -- optional metadata filter.
      • Optional_contextUser: UserInfo

      Returns Promise<BaseResponse>

      A BaseResponse whose data is a QueryResponse containing scored matches, or a failure response on error.

      Never throws; errors are caught and returned as a failure response.

    • Wire in the host relational connection so this provider reuses it for colocated storage and queries instead of opening its own pool. No-op semantics for providers that ignore it; colocated providers require it before any operation.

      Parameters

      Returns void

    • Convenience used by callers that hold an opaque provider reference (the active MJ data provider). If host implements IColocatedVectorHost and this provider supports colocated queries, wire it in.

      Parameters

      • host: unknown

      Returns boolean

      true if the host was wired in, false otherwise.

    • Build a standard FAILURE BaseResponse.

      Always return this (never a success response) from a catch block — returning a success response on error silently swallows real failures and makes callers, and the vectorization pipeline, believe an operation worked when it did not.

      Parameters

      • Optionalmessage: string

        Optional human-readable error detail; falls back to a generic message.

      Returns BaseResponse

    • Build a standard SUCCESS BaseResponse. Shared across all drivers so every provider reports results in a uniform shape.

      Parameters

      • data: unknown

        The provider-specific payload to attach to the response.

      Returns BaseResponse