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