ホームページ  >  記事  >  バックエンド開発  >  PHP redisを使った超ミニ全文検索のコード例を詳しく紹介

PHP redisを使った超ミニ全文検索のコード例を詳しく紹介

黄舟
黄舟オリジナル
2017-03-06 09:25:451372ブラウズ

この記事は主に超ミニ全文検索を実現するための PHP redis の関連情報を詳しく紹介します。興味のある方は参考にしてください。

シナリオ: 私たちのプラットフォームには多くのゲームがあります。同僚が特定のゲームについて問い合わせる場合、現在は HTML 選択ドロップダウン リスト表示形式を使用していますが、これは時間も労力もかかります

。効果: 「Three Kingdoms」または「Three Kingdoms」と入力すると、「Three Kingdoms」を含むすべてのゲーム名が自動的にリストされます。入力順序は制限されません。たとえば、「Three Kingdoms」と入力すると、ゲーム「Three Kingdoms」が表示されます。キングダムズ」はまだ見つかります

実装: redis + PHPのarray_intersect()とmbシリーズ関数のコレクションを使用して、超ミニ全文検索機能を実現します

原理: (道は2つまたは3つだけです言葉が長いので、本当のことを言うのは一銭の価値もありません (笑)

1. ゲーム名を読み上げ、単一の漢字に分割します

2. これらの漢字を Redis コレクションのキーとして使用して書き込みます。各コレクションの値は、ゲーム名にこの漢字が含まれるすべてのゲームの ID です

3、ユーザーがテキストを入力すると、ユーザー入力が ajax 非同期リクエストを通じて PHP に渡されます

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, &#39;UTF-8&#39;);
        $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, &#39;UTF-8&#39;);
      for ($i=0; $i < $intGnameLength; $i++) {
        $strOne = mb_substr($gname, $i, 1, &#39;UTF-8&#39;);
        $arrIndex[$strOne][] = $gid;
      }
    }
    
    $this->load->library(&#39;iredis&#39;);
    foreach ($arrIndex as $word => $arrGid) {
      foreach ($arrGid as $gid) {
        $this->iredis->setAutoComplate($word, $gid);
      }
    }
    
  }

Redis の操作方法

//自动补全功能
  public function setAutoComplate($key, $value)
  {
    $youxikey = &#39;youxi_&#39;.$key;
    $this->sAdd($youxikey, $value);
  }

  //自动补全功能
  public function getAutoComplate($key)
  {
    $youxikey = &#39;youxi_&#39;.$key;
    return $this->sMembers($youxikey);
  }

上記は、超ミニ全文検索コード例の PHP Redis 実装の詳細な紹介です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www .php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。