import dotenv from 'dotenv';
dotenv.config();
class VectorStore {
constructor() {
this.documents = [];
}
async init() {
return;
}
preprocessText(text) {
return text.toLowerCase().replace(/[^a-zA-Z0-9\s]/g, '');
}
async addDocument(id, text, metadata = {}) {
const processedText = this.preprocessText(text);
this.documents.push({
id,
text,
processedText,
metadata
});
}
async addDocuments(documents) {
for (const doc of documents) {
await this.addDocument(doc.id, doc.text, doc.metadata);
}
}
keywordSimilarity(query, document) {
const queryWords = new Set(this.preprocessText(query).split(/\s+/));
const docWords = new Set(document.processedText.split(/\s+/));
const intersection = [...queryWords].filter(word => docWords.has(word));
const similarity = queryWords.size > 0 ? intersection.length / queryWords.size : 0;
return similarity;
}
async search(query, k = 3) {
const similarities = this.documents.map(doc => {
const similarity = this.keywordSimilarity(query, doc);
return {
id: doc.id,
document: doc.text,
metadata: doc.metadata,
distance: 1 - similarity
};
});
similarities.sort((a, b) => a.distance - b.distance);
return similarities.slice(0, k);
}
async clear() {
this.documents = [];
}
}
export default VectorStore;