## PGVector

> An implementation of LangChain vectorstore abstraction using `postgres` as the backend and utilizing the `pgvector` extension.

The code lives in an integration package called: [langchain\_postgres](https://github.com/langchain-ai/langchain-postgres/).

You can run the following command to spin up a a postgres container with the `pgvector` extension:

```
docker run --name pgvector-container -e POSTGRES_USER=langchain -e POSTGRES_PASSWORD=langchain -e POSTGRES_DB=langchain -p 6024:5432 -d pgvector/pgvector:pg16
```

## Status[​](#status "Direct link to Status")

This code has been ported over from `langchain_community` into a dedicated package called `langchain-postgres`. The following changes have been made:

*   langchain\_postgres works only with psycopg3. Please update your connnecion strings from `postgresql+psycopg2://...` to `postgresql+psycopg://langchain:langchain@...` (yes, it’s the driver name is `psycopg` not `psycopg3`, but it’ll use `psycopg3`.
*   The schema of the embedding store and collection have been changed to make add\_documents work correctly with user specified ids.
*   One has to pass an explicit connection object now.

Currently, there is **no mechanism** that supports easy data migration on schema changes. So any schema changes in the vectorstore will require the user to recreate the tables and re-add the documents. If this is a concern, please use a different vectorstore. If not, this implementation should be fine for your use case.

## Install dependencies[​](#install-dependencies "Direct link to Install dependencies")

Here, we’re using `langchain_cohere` for embeddings, but you can use other embeddings providers.

```
!pip install --quiet -U langchain_cohere!pip install --quiet -U langchain_postgres
```

## Initialize the vectorstore[​](#initialize-the-vectorstore "Direct link to Initialize the vectorstore")

```
from langchain_cohere import CohereEmbeddingsfrom langchain_core.documents import Documentfrom langchain_postgres import PGVectorfrom langchain_postgres.vectorstores import PGVector# See docker command above to launch a postgres instance with pgvector enabled.connection = "postgresql+psycopg://langchain:langchain@localhost:6024/langchain"  # Uses psycopg3!collection_name = "my_docs"embeddings = CohereEmbeddings()vectorstore = PGVector(    embeddings=embeddings,    collection_name=collection_name,    connection=connection,    use_jsonb=True,)
```

## Drop tables[​](#drop-tables "Direct link to Drop tables")

If you need to drop tables (e.g., updating the embedding to a different dimension or just updating the embedding provider):

```
vectorstore.drop_tables()
```

## Add documents[​](#add-documents "Direct link to Add documents")

Add documents to the vectorstore

```
docs = [    Document(        page_content="there are cats in the pond",        metadata={"id": 1, "location": "pond", "topic": "animals"},    ),    Document(        page_content="ducks are also found in the pond",        metadata={"id": 2, "location": "pond", "topic": "animals"},    ),    Document(        page_content="fresh apples are available at the market",        metadata={"id": 3, "location": "market", "topic": "food"},    ),    Document(        page_content="the market also sells fresh oranges",        metadata={"id": 4, "location": "market", "topic": "food"},    ),    Document(        page_content="the new art exhibit is fascinating",        metadata={"id": 5, "location": "museum", "topic": "art"},    ),    Document(        page_content="a sculpture exhibit is also at the museum",        metadata={"id": 6, "location": "museum", "topic": "art"},    ),    Document(        page_content="a new coffee shop opened on Main Street",        metadata={"id": 7, "location": "Main Street", "topic": "food"},    ),    Document(        page_content="the book club meets at the library",        metadata={"id": 8, "location": "library", "topic": "reading"},    ),    Document(        page_content="the library hosts a weekly story time for kids",        metadata={"id": 9, "location": "library", "topic": "reading"},    ),    Document(        page_content="a cooking class for beginners is offered at the community center",        metadata={"id": 10, "location": "community center", "topic": "classes"},    ),]
```

```
vectorstore.add_documents(docs, ids=[doc.metadata["id"] for doc in docs])
```

```
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

```
vectorstore.similarity_search("kitty", k=10)
```

```
[Document(page_content='there are cats in the pond', metadata={'id': 1, 'topic': 'animals', 'location': 'pond'}), Document(page_content='the book club meets at the library', metadata={'id': 8, 'topic': 'reading', 'location': 'library'}), Document(page_content='the library hosts a weekly story time for kids', metadata={'id': 9, 'topic': 'reading', 'location': 'library'}), Document(page_content='the new art exhibit is fascinating', metadata={'id': 5, 'topic': 'art', 'location': 'museum'}), Document(page_content='ducks are also found in the pond', metadata={'id': 2, 'topic': 'animals', 'location': 'pond'}), Document(page_content='the market also sells fresh oranges', metadata={'id': 4, 'topic': 'food', 'location': 'market'}), Document(page_content='a cooking class for beginners is offered at the community center', metadata={'id': 10, 'topic': 'classes', 'location': 'community center'}), Document(page_content='fresh apples are available at the market', metadata={'id': 3, 'topic': 'food', 'location': 'market'}), Document(page_content='a sculpture exhibit is also at the museum', metadata={'id': 6, 'topic': 'art', 'location': 'museum'}), Document(page_content='a new coffee shop opened on Main Street', metadata={'id': 7, 'topic': 'food', 'location': 'Main Street'})]
```

Adding documents by ID will over-write any existing documents that match that ID.

```
docs = [    Document(        page_content="there are cats in the pond",        metadata={"id": 1, "location": "pond", "topic": "animals"},    ),    Document(        page_content="ducks are also found in the pond",        metadata={"id": 2, "location": "pond", "topic": "animals"},    ),    Document(        page_content="fresh apples are available at the market",        metadata={"id": 3, "location": "market", "topic": "food"},    ),    Document(        page_content="the market also sells fresh oranges",        metadata={"id": 4, "location": "market", "topic": "food"},    ),    Document(        page_content="the new art exhibit is fascinating",        metadata={"id": 5, "location": "museum", "topic": "art"},    ),    Document(        page_content="a sculpture exhibit is also at the museum",        metadata={"id": 6, "location": "museum", "topic": "art"},    ),    Document(        page_content="a new coffee shop opened on Main Street",        metadata={"id": 7, "location": "Main Street", "topic": "food"},    ),    Document(        page_content="the book club meets at the library",        metadata={"id": 8, "location": "library", "topic": "reading"},    ),    Document(        page_content="the library hosts a weekly story time for kids",        metadata={"id": 9, "location": "library", "topic": "reading"},    ),    Document(        page_content="a cooking class for beginners is offered at the community center",        metadata={"id": 10, "location": "community center", "topic": "classes"},    ),]
```

## Filtering Support[​](#filtering-support "Direct link to Filtering Support")

The vectorstore supports a set of filters that can be applied against the metadata fields of the documents.

| Operator | Meaning/Category |
| --- | --- |
| \\$eq | Equality (==) |
| \\$ne | Inequality (!=) |
| \\$lt | Less than (\\<) |
| \\$lte | Less than or equal (\\<=) |
| \\$gt | Greater than (\>) |
| \\$gte | Greater than or equal (\>\=) |
| \\$in | Special Cased (in) |
| \\$nin | Special Cased (not in) |
| \\$between | Special Cased (between) |
| \\$like | Text (like) |
| \\$ilike | Text (case-insensitive like) |
| \\$and | Logical (and) |
| \\$or | Logical (or) |

```
vectorstore.similarity_search("kitty", k=10, filter={"id": {"$in": [1, 5, 2, 9]}})
```

```
[Document(page_content='there are cats in the pond', metadata={'id': 1, 'topic': 'animals', 'location': 'pond'}), Document(page_content='the library hosts a weekly story time for kids', metadata={'id': 9, 'topic': 'reading', 'location': 'library'}), Document(page_content='the new art exhibit is fascinating', metadata={'id': 5, 'topic': 'art', 'location': 'museum'}), Document(page_content='ducks are also found in the pond', metadata={'id': 2, 'topic': 'animals', 'location': 'pond'})]
```

If you provide a dict with multiple fields, but no operators, the top level will be interpreted as a logical **AND** filter

```
vectorstore.similarity_search(    "ducks",    k=10,    filter={"id": {"$in": [1, 5, 2, 9]}, "location": {"$in": ["pond", "market"]}},)
```

```
[Document(page_content='ducks are also found in the pond', metadata={'id': 2, 'topic': 'animals', 'location': 'pond'}), Document(page_content='there are cats in the pond', metadata={'id': 1, 'topic': 'animals', 'location': 'pond'})]
```

```
vectorstore.similarity_search(    "ducks",    k=10,    filter={        "$and": [            {"id": {"$in": [1, 5, 2, 9]}},            {"location": {"$in": ["pond", "market"]}},        ]    },)
```

```
[Document(page_content='ducks are also found in the pond', metadata={'id': 2, 'topic': 'animals', 'location': 'pond'}), Document(page_content='there are cats in the pond', metadata={'id': 1, 'topic': 'animals', 'location': 'pond'})]
```

```
vectorstore.similarity_search("bird", k=10, filter={"location": {"$ne": "pond"}})
```

```
[Document(page_content='the book club meets at the library', metadata={'id': 8, 'topic': 'reading', 'location': 'library'}), Document(page_content='the new art exhibit is fascinating', metadata={'id': 5, 'topic': 'art', 'location': 'museum'}), Document(page_content='the library hosts a weekly story time for kids', metadata={'id': 9, 'topic': 'reading', 'location': 'library'}), Document(page_content='a sculpture exhibit is also at the museum', metadata={'id': 6, 'topic': 'art', 'location': 'museum'}), Document(page_content='the market also sells fresh oranges', metadata={'id': 4, 'topic': 'food', 'location': 'market'}), Document(page_content='a cooking class for beginners is offered at the community center', metadata={'id': 10, 'topic': 'classes', 'location': 'community center'}), Document(page_content='a new coffee shop opened on Main Street', metadata={'id': 7, 'topic': 'food', 'location': 'Main Street'}), Document(page_content='fresh apples are available at the market', metadata={'id': 3, 'topic': 'food', 'location': 'market'})]
```

* * *

#### Help us out by providing feedback on this documentation page: