Я пытаюсь создать почтовый сервер на основе базы данных. Для этого я решил использовать CassandraDB. Основная проблема: чем больше почты у меня в таблице, тем длиннее ответ таблицы (это нормально, но масштабно). В настоящее время я получил только 20000 писем, и Кассандра прислала мне тайм-аут (очевидно, по умолчанию установлен на 5 сек). Цель состоит в том, чтобы каждый пользователь мог найти почту в моей таблице, содержащую более 500 тысяч писем, с возможностью фильтрации своих писем.
Вот моя структура таблицы:
CREATE TABLE mail__mail (
accountid uuid,
date timestamp,
id uuid,
attachment set<uuid>,
categories set<uuid>,
content text,
dateadded timestamp,
folderid uuid,
hash text,
isconfidential boolean,
isdeleted boolean,
isimportant boolean,
isseen boolean,
mailcc text,
mailfrom text,
mailid text,
mailto text,
size bigint,
subject text,
PRIMARY KEY (accountid, date, id)
) WITH CLUSTERING ORDER BY (date DESC,id ASC);
CREATE CUSTOM INDEX mailFromIndex ON mail__mail (mailfrom) USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS','analyzed': 'true', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 'case_sensitive': 'false'};
CREATE CUSTOM INDEX subjectIndex ON mail__mail (subject) USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS','analyzed': 'true', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 'case_sensitive': 'false'};
Я почти уверен, что моя структура плохая из-за моих слабых навыков в CassandraDB.
Вот операции, которые я хочу получить с помощью этой таблицы:
- ОБНОВЛЕНИЕ: isImportant, isConfidential, isDeleted, isSeen, mailId, folderId, категории
- УДАЛИТЬ: по id, по folderId, accountId
- SELECT: по id, по folderId, по accountId
И я хотел бы выбрать с этим фильтром:
- ЗАКАЗАТЬ ПО: дата, размер, mailFrom (ASC и DESC)
- СОДЕРЖИТ: категории (я могу назначить некоторым категориям свою почту, и я хочу отфильтровать всю электронную почту в одной или нескольких категориях)
- LIKE '% search %': mailFrom, подлежит фильтрации почты, содержащей мой поиск
- Равно: isConfidential, isImportant, isDeleted, isSeen, чтобы получить всю конфиденциальную, важную, удаленную или просмотренную почту.
Моя таблица работает с несколькими строками (она работает с 7k электронными письмами приблизительно за 1000 мс), но я думаю, что это может быть быстрее с хорошей структурой и хорошим запросом (без РАЗРЕШЕНИЯ НА ФИЛЬТР).
Более того, я, очевидно, не могу использовать CONTAINS и LIKE '% text %' в том же запросе, он дал мне код ошибки 1300. Так что я сделал этот шаг в python, но, на мой взгляд, это падение производительности, было бы здорово, если бы я мог делать все с помощью cassandra.
Для запроса моего CassandraDB я использую драйвер Cassandra Python3.5, но я не думаю, что эта информация актуальна.
Скажите, если вам нужна дополнительная информация,
заранее спасибо!
РЕДАКТИРОВАТЬ: В качестве решения я следую тому, что вы, ребята, сказали мне, я развертываю новый сервер с Elassandra (ElasticSeach + Cassandra). Я постараюсь дать вам результат, который я получу, как можно скорее.