어떻게 경 량 의 사용자 autocomplete 시스템 을 설계 합 니까?
24987 단어 autocomplete
어떻게 경 량 의 사용자 autocomplete 시스템 을 설계 합 니까?
좋 은 문제
1
나 쁜 문제
저장 하지 않 음
1
나 는 최근 에 시스템 을 설계 할 때 사용자 가 아래 에서 선택 하 는 기능 이 필요 하 다.이니셜 을 입력 하면 자동 으로 연상 되 는 autocomplete 모드 로 설계 해 야 한다.지금 백 엔 드 데이터 구 조 를 설계 하 는 데 어려움 을 겪 고 있 습 니 다.현 재 는 제 가 직접 my sql 의
LIKE
으로 만 든 이 기능 이지 만 사용자 와 방 문 량 이 증가 하면 서 느 릴 것 입 니 다.제 가 사용 하 는 것 은 redis 캐 시 입 니 다.redis 를 사용 하 는 친구 들 은 모두 그 redis 로 autocomplete 를 실현 하 는 글 을 읽 었 을 것 입 니 다.그러나 내 가 말 하고 자 하 는 것 은 이 글 이 결코 나의 문 제 를 해결 하지 못 한 다 는 것 이다.키워드 의 연상 기능 만 완성 할 수 있 지만 키 워드 는 상태 가 없고 색인 표시 id 가 없습니다.자동 연상 을 완성 하 는 것 외 에 키워드 와 사용자 의 관련 과정 을 완성 할 수 없다 는 것 이다.
또 다른 단점 은 이 색인 의 대가 가 너무 높 아서 모든 글자 에 단 어 를 나 눈 다음 cache 에 넣 어 색인 을 만들어 야 한 다 는 것 이다.사용자 이름 은 수정 할 수 있 습 니 다.색인 을 수정 할 때마다 재 구축 하 는 비용 이 너무 크다 고 생각 합 니 다.
나 는 redis 의 교차 기능 을 이용 하여 검색 하 는 또 다른 방안 을 생각 했다.이것 도 비교적 유행 하 는 방법 이다.예 를 들 어 하나의 사용자 이름 은
Hello
이 고 phop 코드 로 이 사용자 이름 을 어떻게 처리 하 는 지 보 여 줍 니 다.전시 편 의 를 위해 저 는 영문 자모 만 처리 합 니 다.$user_name = strtolower('Hello');
$user_id = 1001;
$len = strlen($user_name);
for ($pos = 0; $pos < $len; $pos ++) {
$key = md5($user_name[$pos]);
$redis->sAdd('user_name:' . $key . ':' . $pos, $user_id);
}
위의 코드 에서 나 는 모든 자 모 를
md5
해시 로 한 번 사용 한 후에 그의 위치 값 $pos
과 함께 redis 색인 을 구성 했다.이렇게 하면 모든 사용자 이름 이 이런 방법 으로 색인 을 만 든 후에 우 리 는 redis 의 교 집합 기능 을 사용 하여 검색 할 수 있다.$keyword = strtolower('he'); //
$indexes = array(); //
$len = strlen($keyword);
for ($pos = 0; $pos < $len; $pos ++) {
$key = md5($keyword[$pos]);
$indexes[] = 'user_name:' . $key . ':' . $pos;
}
// ,
$result = $redis->sInter($indexes);
그러나 이 방법 에는 몇 가지 결함 이 있다.
검색 보 다 는 사용자 이름 이 자동 으로 연상 되 는 기능 을 실현 하고 싶 기 때문에 편중 되 는 것 같 습 니 다.이러한 시스템 은 방대 한 색인 을 유지 해 야 하 며,매번 사용자 이름 을 업데이트 할 때마다 하나씩 삭제 한 후에 다시 새 것 을 넣 어야 한다.
LIMIT
과 OFFSET
을 할 수 없습니다.모호 조회 기능 이 약해 키워드 로 시작 하 는 경우 만 처리 할 수 있다.하지만 이 건 중요 하지 않 아 요.위의 두 가 지 를 해결 할 수 있 었 으 면 좋 겠 어 요.
여러분 은 어떤 좋 은 방안 이 있 나 요?
redis
mysql
autocomplete
댓 글 0 개
|
수정 하 다.
|
링크
시간 선후
득 표 수
대답
좋 은 답안
0
엉터리 답안
huacnlee
1 14 분 전
http://github.com/huacnlee/redis-sear...
모든 글자 가 색인 되 어 있 는 것 은 아 닙 니 다.zset 에 만 모든 글자 가 있 지만 데이터 가 중복 되 는 것 은 합 쳐 집 니 다.제 모호 한 조 회 는 단어의 결 과 를 색인 으로 합 니 다.
사용자 와 특정 키워드 의 관련 기능 은 제 다음 단계 의 실현 목표(별명 필드 추가) 입 니 다.
메모리 사용량:89m,7500+실제 데 이 터 는 접두사 일치 색인 에서 2086+단어 색인,그 밖 에 1 만 여 개의 실제 데이터 가 있 습 니 다.
huacnlee 1 9 분 전에 수정
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
kintone 개발을 보다 효율적으로 하기 위해 ~Atom 패키지 개발~평상시는 대학에서 kintone 사용해 NPO 쪽의 업무 어플리케이션을 작성하게 하고 있습니다. 개인적으로 kintone 커스터마이즈나 플러그인의 작성 등도 조금 행하고 있습니다만, 가끔 kintone 용 API 스...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.