Следите за трендовыми хэштегами


Я добавляю "Поддержку хэштегов" в свое веб-приложение для микроблогов. Как twitter, google+, facebook и другие. пользователи моего приложения могут добавлять хэштеги в свои сообщения. Хэштеги преобразуются в html-якоря, указывающие на страницу поиска со списком всех связанных сообщений. Теперь Я хочу также показать "Трендовые хэштеги".

Сообщения сохраняются в таблице MySQL (InnoDB) вместе с идентификатором пользователя и некоторыми мета_данными.

Я думал о следующем способе справиться с трендом ХТ:

  1. Извлеките хэштеги из сообщения;

    <?php
    preg_match_all( '/(#\w[\w\d]+)/', $message, $ht_matches );
    $hashtags     = array_unique($ht_matches[1]);
    $hashtags_str = implode( ' ', $hashtags );
    
  2. сохраните их в отдельной строке в записи бд (строка, разделенная пробелом);

    e.g. #SanFrancisco #Boeing777 #AirplaneAccident
    
    --- 
    --- Table 'messages'
    ---
    +----+------------+--------------------------------------------+-----+
    | id | message    | hashtag                                    | ... |
    +----+------------+--------------------------------------------+-----+
    |  1 | ...        | #SanFrancisco #Boeing777 #AirplaneAccident | ... |
    +----+------------+--------------------------------------------+-----+
    
  3. храните каждый хэштег в отдельной таблице, если он не существует, вместе с метаданными;

    --- 
    --- 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'
    
  4. запросите базу данных, чтобы получить трендовые хэштеги, например:

    SELECT id FROM message_hashtags WHERE messages > 1 ORDER_BY messages LIMIT 10
    


Это все теоретически. Будет ли эта установка хорошо работать в долгосрочной перспективе? Меня беспокоят возможные узкие места и проблемы с хранилищем, которые могут привести к плохой производительности и неудобствам. Я не считаю это преждевременной оптимизацией, потому что, если я не сделаю это правильно сейчас, мне нужно будет многое изменить позже, если это вообще возможно.

Хэштеги - популярная тема, поэтому я предполагаю, что у некоторых из вас есть опыт работы с HT и связанным с ними поиском.

Я открыт для предложений и информация, которая может указывать на другое направление работы с хэштегами.

Author: Markus Hofmann, 2013-07-10

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. Используя СОЕДИНЕНИЕ, вы можете получить всю информацию о самом хэштеге.

 3
Author: Madara Uchiha, 2013-07-10 16:38:15