Как найти и сохранить количество раз, когда пользователь был частью критерия поиска - PullRequest
0 голосов
/ 10 октября 2010

LinkedIn предоставляет механизм, позволяющий сказать, что пользователь участвовал в поиске по критерию «n» количество раз за последние «x» дни.Как вы собираете и храните информацию?Предполагается ли вам повторять результаты поиска и ставить соответствующий счетчик всякий раз, когда их ищут, или существует неинтрузивный механизм, с помощью которого это может быть захвачено на более низком уровне (чем уровень приложения)

Ответы [ 2 ]

1 голос
/ 10 октября 2010

вы могли бы сделать что-то вроде этого (http://pastie.org/1211302):

drop table if exists users;
create table users
(
user_id int unsigned not null auto_increment primary key,
username varbinary(32) unique not null
)
engine=innodb;

insert into users (username) values ('f00'),('bar'),('foobar'),('alpha'),('felix');

drop table if exists user_hits;
create table user_hits
(
hit_id int unsigned not null auto_increment primary key,
hit_date datetime not null,
user_id int unsigned not null,
key hit_date_user_idx(hit_date, user_id)
)
engine=innodb;

drop procedure if exists user_search;

delimiter #

create procedure user_search
(
in p_username varbinary(32)
)
begin

  set p_username = trim(replace(p_username, '%',''));

  create temporary table matches engine=memory 
    select * from users where username like concat(p_username,'%');

  insert into user_hits (hit_date, user_id) select now(), user_id from matches;

  select * from matches order by username;

  drop temporary table if exists matches;

end #

delimiter ;

drop procedure if exists user_hits;

delimiter #

create procedure user_hits
(
in p_user_id int unsigned,
in p_day_interval smallint unsigned
)
begin

 select 
  user_id, 
  hit_date, 
  count(*) as hits 
 from 
  user_hits
 where
  hit_date between now() - interval p_day_interval day and now() and 
  user_id = p_user_id
 group by
  hit_date, user_id;

end #

delimiter ;

-- testing

select * from users;
select * from user_hits;

call user_search('f00');

select * from user_hits;

call user_search('f');

select * from user_hits;

call user_hits(1,7);
1 голос
/ 10 октября 2010

Самый простой подход заключается в регистрации всех поисков и подсчете (с помощью SQL), сколько раз появляется конкретный пользователь. Что-то с эффектом: SELECT COUNT(1) FROM search_log WHERE search_string = 'this-user-name'

Это может быть непрактичное количество данных для запроса в режиме реального времени, однако, особенно если вы хотите подсчитать результаты поиска, которые просто включают имя пользователя (например, "щенки, котята и этот пользователь- название"). В этом случае самый прямой подход заключается в том, чтобы просто включить в таблицу user поле, которое учитывает результаты поиска. Затем, когда вы обрабатываете каждый поиск, вы можете искать в нем любые имена пользователей и увеличивать соответствующие счетчики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...