diff --git a/examples/qdrantdb/README.md b/examples/qdrantdb/README.md new file mode 100644 index 0000000000000000000000000000000000000000..7ea0de26ce26c9ba55b5b56ad6409a61d248117b --- /dev/null +++ b/examples/qdrantdb/README.md @@ -0,0 +1,11 @@ +# Qdrant Vector Store Example + +How to run `examples/qdrantdb/preFilters.ts`: + +Add your OpenAI API Key into a file called `.env` in the parent folder of this directory. It should look like this: + +``` +OPEN_API_KEY=sk-you-key +``` + +Now, open a new terminal window and inside `examples`, run `npx ts-node qdrantdb/preFilters.ts`. diff --git a/examples/qdrantdb/preFilters.ts b/examples/qdrantdb/preFilters.ts new file mode 100644 index 0000000000000000000000000000000000000000..54a394ab74ea48b132ad3698376dbc480c640fd1 --- /dev/null +++ b/examples/qdrantdb/preFilters.ts @@ -0,0 +1,82 @@ +import * as dotenv from "dotenv"; +import { + CallbackManager, + Document, + MetadataMode, + QdrantVectorStore, + VectorStoreIndex, + serviceContextFromDefaults, + storageContextFromDefaults, +} from "llamaindex"; + +// Load environment variables from local .env file +dotenv.config(); + +const collectionName = "dog_colors"; +const qdrantUrl = "http://127.0.0.1:6333"; + +async function main() { + try { + const docs = [ + new Document({ + text: "The dog is brown", + metadata: { + dogId: "1", + }, + }), + new Document({ + text: "The dog is red", + metadata: { + dogId: "2", + }, + }), + ]; + console.log("Creating QdrantDB vector store"); + const qdrantVs = new QdrantVectorStore({ url: qdrantUrl, collectionName }); + const ctx = await storageContextFromDefaults({ vectorStore: qdrantVs }); + + console.log("Embedding documents and adding to index"); + const index = await VectorStoreIndex.fromDocuments(docs, { + storageContext: ctx, + serviceContext: serviceContextFromDefaults({ + callbackManager: new CallbackManager({ + onRetrieve: (data) => { + console.log( + "The retrieved nodes are:", + data.nodes.map((node) => node.node.getContent(MetadataMode.NONE)), + ); + }, + }), + }), + }); + + console.log( + "Querying index with no filters: Expected output: Brown probably", + ); + const queryEngineNoFilters = index.asQueryEngine(); + const noFilterResponse = await queryEngineNoFilters.query({ + query: "What is the color of the dog?", + }); + console.log("No filter response:", noFilterResponse.toString()); + console.log("Querying index with dogId 2: Expected output: Red"); + const queryEngineDogId2 = index.asQueryEngine({ + preFilters: { + filters: [ + { + key: "dogId", + value: "2", + filterType: "ExactMatch", + }, + ], + }, + }); + const response = await queryEngineDogId2.query({ + query: "What is the color of the dog?", + }); + console.log("Filter with dogId 2 response:", response.toString()); + } catch (e) { + console.error(e); + } +} + +main(); diff --git a/packages/core/src/storage/vectorStore/QdrantVectorStore.ts b/packages/core/src/storage/vectorStore/QdrantVectorStore.ts index 44448c71afd1748c316036fae327fbdc069ba5bf..61eecf7a905e5b0e60ef1db2c435e249178e6cd6 100644 --- a/packages/core/src/storage/vectorStore/QdrantVectorStore.ts +++ b/packages/core/src/storage/vectorStore/QdrantVectorStore.ts @@ -289,7 +289,7 @@ export class QdrantVectorStore implements VectorStore { * @param query The VectorStoreQuery to be used */ private async buildQueryFilter(query: VectorStoreQuery) { - if (!query.docIds && !query.queryStr) { + if (!query.docIds && !query.queryStr && !query.filters) { return null; }