From ffb195ea7a3afa4c9865da2817bbbdd486c086d7 Mon Sep 17 00:00:00 2001 From: shodevacc <69896964+shodevacc@users.noreply.github.com> Date: Mon, 18 Mar 2024 00:53:51 -0400 Subject: [PATCH] Fix: Metadata filters doesn't seem to work for Qdrant (#623) --- examples/qdrantdb/README.md | 11 +++ examples/qdrantdb/preFilters.ts | 82 +++++++++++++++++++ .../storage/vectorStore/QdrantVectorStore.ts | 2 +- 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 examples/qdrantdb/README.md create mode 100644 examples/qdrantdb/preFilters.ts diff --git a/examples/qdrantdb/README.md b/examples/qdrantdb/README.md new file mode 100644 index 000000000..7ea0de26c --- /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 000000000..54a394ab7 --- /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 44448c71a..61eecf7a9 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; } -- GitLab