이 기사에서는 초소형 전체 텍스트 검색을 구현하기 위한 PHP redis 관련 정보를 주로 소개합니다. 관심 있는 친구는
시나리오를 참조할 수 있습니다. 우리 플랫폼에는 많은 게임이 있습니다. 운영 동료가 특정 게임을 쿼리할 때 현재는 html 선택 드롭다운 목록 표시 형식을 사용하고 있습니다.
효과: "삼국지" 또는 "삼국지"를 입력하면 "삼국지"가 포함된 모든 게임 이름이 자동으로 나열되며 입력 순서는 제한되지 않습니다. 예를 들어, "Kill Three Kingdoms"를 입력하면 결과는 여전히 "Three Kingdoms" 게임을 찾을 것입니다.
구현: redis 컬렉션 + PHP의 array_intersect()를 사용하고 mb 시리즈 기능으로 초소형 전문 검색 기능 구현
원리: (진실은 두세 단어만 있어도 진실을 말하면 한 푼도 아깝지 않죠, 하하)
1. 모든 게임 이름을 읽어서 개별 한자로 나눕니다2. 이 한자를 redis 컬렉션의 키로 사용하고 각각의 값을 씁니다. collection은 이름에 이 한자가 포함된 모든 게임의 ID입니다. 3. 사용자가 입력할 때 텍스트를 작성할 때 ajax 비동기 요청을 통해 사용자 입력을 전달합니다4. 개별 한자에 텍스트를 입력하고 각각 redis에서 해당 한자의 설정된 값을 찾습니다5. 꺼내서 교차점을 찾고 에서 이 한자가 포함된 게임의 ID를 찾습니다. 동시에 6. 마지막으로 데이터베이스에 가서 해당 게임 정보를 찾습니다단점: 데이터 삭제가 불편함
PHP 코드 Redis에 쓰기 및 검색://自动补全 //不限输入汉字的前后顺序: 输入"国三杀" => 输出 "三国杀" function getAutoComplate() { //$word = $this->input->post('word'); $word = '三国'; if (empty($word)) { exit('0'); } $intWordLength = mb_strlen($word, 'UTF-8'); $this->load->library('iredis'); if (1 == $intWordLength) { $arrGid = $this->iredis->getAutoComplate($word); } else { $arrGid = array(); for ($i=0; $i < $intWordLength; $i++) { $strOne = mb_substr($word, $i, 1, 'UTF-8'); $arrGidTmp = $this->iredis->getAutoComplate($strOne); $arrGid = empty($arrGid) ? $arrGidTmp : array_intersect($arrGid, $arrGidTmp); //求交集,因为传入的参数个数不确定,因此不能直接求交集 } } $arrGame = $this->gamemodel->getGameNameForAutoComplate($arrGid); // var_dump($arrGame);exit; $jsonGame = json_encode($arrGame); exit($jsonGame); } //自动补全, 建立索引 function setAutoComplate() { $arrGame = $this->gamemodel->getAllGameNameForAutoComplate(); $arrIndex = array(); foreach ($arrGame as $gid => $gname) { $intGnameLength = mb_strlen($gname, 'UTF-8'); for ($i=0; $i < $intGnameLength; $i++) { $strOne = mb_substr($gname, $i, 1, 'UTF-8'); $arrIndex[$strOne][] = $gid; } } $this->load->library('iredis'); foreach ($arrIndex as $word => $arrGid) { foreach ($arrGid as $gid) { $this->iredis->setAutoComplate($word, $gid); } } }
//自动补全功能 public function setAutoComplate($key, $value) { $youxikey = 'youxi_'.$key; $this->sAdd($youxikey, $value); } //自动补全功能 public function getAutoComplate($key) { $youxikey = 'youxi_'.$key; return $this->sMembers($youxikey); }