Index local documents for RAG using Ollama embeddings and Qdrant

Go to Workflow
0 views
Built by Akash Narayan Akash Narayan
Created on August 03, 2026

Description

Quick overview
This workflow ingests a local document file, splits it into chunks, generates embeddings with Ollama (nomic-embed-text), and stores the vectors in a Qdrant collection for on-prem RAG indexing.

How it works
Runs manually when you click Execute workflow in n8n.
Reads a document from disk from the n8n host/container file system.
Extracts text content from the file (configured for PDF extraction).
Splits the extracted text into overlapping chunks using a recursive character splitter.
Generates embeddings for each chunk with Ollama using the nomic-embed-text model.
Inserts the chunk texts and their embeddings into a specified Qdrant collection.

Setup
Self-host n8n with a mounted volume and update the file path to a container-accessible path in the Read/Write Files from Disk step.
Run Ollama locally, pull the nomic-embed-text model, and add an Ollama credential in n8n pointing to your Ollama instance.
Set up a Qdrant instance, create a Qdrant API credential in n8n (URL and API key), and set the target collection name (for example, handbook) in the Qdrant step.

Requirements
Self-hosted n8n (Docker or npm-based) this workflow will not run on n8n Cloud, since it depends on the local-filesystem "Read/Write Files from Disk" node.
Ollama installed and running locally, with the nomic-embed-text model pulled (ollama pull nomic-embed-text).
A Qdrant instance (local or cloud) with a URL and API key you can register as an n8n credential.
A document file (PDF by default; swap the extraction node's operation for other formats) accessible on the n8n host/container filesystem.

Customization
Swap the embedding model by changing the Ollama credential/model name to a different local embedding model.
Point the "Extract from File" node at a different format (DOCX, CSV, HTML) instead of PDF.
Adjust chunk size/overlap on the Recursive Character Text Splitter for longer or shorter context windows.
Swap Qdrant for another n8n-supported vector store if you'd rather not self-host Qdrant.
Replace the manual trigger with a Schedule Trigger or Webhook to automate ingestion of new files as they arrive.

Additional info
Pairs with a companion template, "Local RAG Query Chatbot," which queries the same Qdrant collection this workflow populates — run this Indexer first, then use that template to ask questions about the indexed content. Runs entirely on local models (Ollama + Qdrant), so there's no per-query API cost once set up.

Known limitation: retrieval quality on the companion query template depends on the Vector Store Retriever's Top K setting. With the default value, questions needing multiple facts at once may retrieve an incomplete set of chunks, and the assistant will correctly decline rather than guess. Increase Top K on the retriever node if you need broader recall.

Nodes Used (4)

Default Data Loader
@n8n/n8n-nodes-langchain.documentDefaultDataLoader
Embeddings Ollama
@n8n/n8n-nodes-langchain.embeddingsOllama
Qdrant Vector Store
@n8n/n8n-nodes-langchain.vectorStoreQdrant
Recursive Character Text Splitter
@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter