Следите за трендовыми хэштегами
Я добавляю "Поддержку хэштегов" в свое веб-приложение для микроблогов. Как twitter, google+, facebook и другие. пользователи моего приложения могут добавлять хэштеги в свои сообщения. Хэштеги преобразуются в html-якоря, указывающие на страницу поиска со списком всех связанных сообщений. Теперь Я хочу также показать "Трендовые хэштеги".
Сообщения сохраняются в таблице MySQL (InnoDB) вместе с идентификатором пользователя и некоторыми мета_данными.
Я думал о следующем способе справиться с трендом ХТ:
-
Извлеките хэштеги из сообщения;
<?php preg_match_all( '/(#\w[\w\d]+)/', $message, $ht_matches ); $hashtags = array_unique($ht_matches[1]); $hashtags_str = implode( ' ', $hashtags );
-
сохраните их в отдельной строке в записи бд (строка, разделенная пробелом);
e.g. #SanFrancisco #Boeing777 #AirplaneAccident --- --- Table 'messages' --- +----+------------+--------------------------------------------+-----+ | id | message | hashtag | ... | +----+------------+--------------------------------------------+-----+ | 1 | ... | #SanFrancisco #Boeing777 #AirplaneAccident | ... | +----+------------+--------------------------------------------+-----+
-
храните каждый хэштег в отдельной таблице, если он не существует, вместе с метаданными;
--- --- Table 'message_hashtags' --- +----+---------------------+------------+---------------------+---------------------+ | id | hashtag | messages | created_at | updated_at | +----+---------------------+------------+---------------------+---------------------+ | 1 | #SanFrancisco | 1465 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | +----+---------------------+------------+---------------------+---------------------+ | 2 | #Boeing777 | 294 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | +----+---------------------+------------+---------------------+---------------------+ | 3 | #AirplaneAccident | 1721 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | +----+---------------------+------------+---------------------+---------------------+ id int not null autoincrement hashtag char(20) not null messages int not null default 0 created_at timestamp not null updated_at timestamp not null default '0000-00-00 00:00:00'
-
запросите базу данных, чтобы получить трендовые хэштеги, например:
SELECT id FROM message_hashtags WHERE messages > 1 ORDER_BY messages LIMIT 10
Это все теоретически. Будет ли эта установка хорошо работать в долгосрочной перспективе? Меня беспокоят возможные узкие места и проблемы с хранилищем, которые могут привести к плохой производительности и неудобствам. Я не считаю это преждевременной оптимизацией, потому что, если я не сделаю это правильно сейчас, мне нужно будет многое изменить позже, если это вообще возможно.
Хэштеги - популярная тема, поэтому я предполагаю, что у некоторых из вас есть опыт работы с HT и связанным с ними поиском.
Я открыт для предложений и информация, которая может указывать на другое направление работы с хэштегами.
1 answers
Возможно, стоит установить связь "многие ко многим" между хэштегами и сообщениями. Это включает в себя добавление еще 2 таблиц:
-
хэштеги - С полями
id
иhashtag
(и, возможно, другими метаданными), которые будут определением для всех существующих хэштегов (и будут обновляться в реальном времени, когда новый будет создан пользователем) -
хэштеги-сообщения - С полями
post_id
иhashtag_id
, которые будут обновляться, когда пользователь создаст пост с хэштегами. Каждая запись в этой таблице представляет собой один хэштег, найденный в сообщении.
Так, например:
hashtags
--------
id | hashtag
---+--------
1 | php
2 | madara
3 | awesome
hashtags-messages
-----------------
post_id | hashtag_id
-----------+-----------
1 | 2
1 | 3
2 | 1
2 | 3
Это означает, что сообщение 1 содержит хэштеги #madara
и #awesome
, в то время как сообщение 2 содержит #php
и #awesome
.
Запрос наиболее популярных хэштегов так же прост, как запрос количества при группировке по hashtag_id. Используя СОЕДИНЕНИЕ, вы можете получить всю информацию о самом хэштеге.