Spaces:
Building
Building
# File: src/search.py | |
import faiss | |
import numpy as np | |
import pickle | |
import os | |
from config.settings import Settings | |
from src.logger import logger | |
class Search: | |
def __init__(self): | |
self.index = faiss.IndexFlatL2(384) | |
self.texts = [] | |
if os.path.exists(Settings.FAISS_INDEX_PATH): | |
self.index = faiss.read_index(Settings.FAISS_INDEX_PATH) | |
if os.path.exists(Settings.TEXTS_PATH): | |
with open(Settings.TEXTS_PATH, "rb") as f: | |
self.texts = pickle.load(f) | |
logger.info("Đã tải FAISS index và texts") | |
def add(self, text, vector): | |
self.index.add(np.array([vector], dtype=np.float32)) | |
self.texts.append(text) | |
faiss.write_index(self.index, Settings.FAISS_INDEX_PATH) | |
with open(Settings.TEXTS_PATH, "wb") as f: | |
pickle.dump(self.texts, f) | |
logger.info(f"Đã thêm vào FAISS: {text[:50]}...") | |
def search(self, vector, k=1): | |
distances, indices = self.index.search(np.array([vector], dtype=np.float32), k) | |
return [(self.texts[i], distances[0][j]) for j, i in enumerate(indices[0]) if i != -1] |