from django.core.management import BaseCommand import clickhouse_connect from vacancies.main.vector_store import add_vectors, extract_features, qdrant_client from vacancies.conf.settings import CLICKHOUSE_HOST, CLICKHOUSE_PORT clickhouse_client = clickhouse_connect.create_client(host=CLICKHOUSE_HOST, port=CLICKHOUSE_PORT) query = """ SELECT id, chat_username, telegram_id, message, timestamp FROM telegram_parser_chatmessage WHERE timestamp >= now() - INTERVAL 30 DAY AND length(message) > 150 AND arrayCount(x -> position(message, x) > 0, [ 'вакансия', 'ищем', 'требуется', 'разработчик', 'будет плюсом', 'зарплата', 'оклад', 'з/п', 'руб', 'опыт работы', 'требования', 'обязанности', 'условия', 'компания', 'офис', 'удаленно', 'гибкий график', 'полный день', 'частичная занятость', 'резюме', 'собеседование', 'junior', 'middle', 'senior' ]) >= 5 AND position(message, 'О себе') = 0 AND position(message, 'Обо мне') = 0 AND position(message, '#ищу') = 0 AND position(message, 'умею') = 0 AND id NOT IN %(exist_points)s """ class Command(BaseCommand): help = "Collect vacancies from telegram messages" def handle(self, *args, **options): next_page_offset = 0 exist_points_ids = [-1] while next_page_offset is not None: response = qdrant_client.scroll( collection_name="vacancies", limit=100_000, offset=next_page_offset, with_payload=False, with_vectors=False, timeout=30, ) exist_points_ids.extend([point.id for point in response[0]]) next_page_offset = response[1] exist_points_set = tuple(set(exist_points_ids)) result_rows = clickhouse_client.query(query, parameters={"exist_points": exist_points_set}).result_rows result_rows_len = len(result_rows) for index, row in enumerate(result_rows): (id, chat_username, telegram_id, message, timestamp) = row link = f"https://t.me/{chat_username}/{telegram_id}" print(f"Processing {index+1}/{result_rows_len} link: {link}") features = extract_features(message) add_vectors( "vacancies", id, features.model_dump(), {'content': message, 'features_json': features.model_dump(), "link": link, "timestamp": timestamp}, )