1

jQuery オートコンプリートを使用して、基本的なオートコンプリート機能を実装しました。毎回DBにクエリを実行しているため、オートコンプリートが非常に遅くなります。Quora のように高速化する方法を探しています。

フロントエンドのコードは次のとおりです。

<script type="text/javascript">


var URL2 = '<?php e(SITE_URL); ?>fronts/searchKeywords';

jQuery(document).ready(function(){

var CityKeyword = jQuery('#CityKeyword');

CityKeyword.autocomplete({
minLength    : 1,
source        : URL2
});

});
 </script>

サーバー側のコードは次のとおりです。

function searchKeywords(){

    if ($this->RequestHandler->isAjax() ) {
        $this->loadModel('Expertise_area');
        Configure::write ( 'debug',0);
        $this->autoRender=false;

        $expertise=$this->Expertise_area->find('all',array(
                'conditions'=>array('Expertise_area.autocomplete_text LIKE'=>'%'.$_GET['term'].'%'), 
                'fields' => array('DISTINCT (Expertise_area.autocomplete_text) AS autocomplete_text'),
                'limit'=>5
        ));
        $i=0;
        if(!empty($expertise)){
            $len = strlen($_GET['term']);
            foreach($expertise as $valueproductname){
                $pos = stripos($valueproductname['Expertise_area']['autocomplete_text'],$_GET['term']);
                $keyvalue = "";

                if($pos == 0) {
                    $keyvalue= "<strong>".substr($valueproductname['Expertise_area']['autocomplete_text'],$pos,$len)."</strong>"
                            .substr($valueproductname['Expertise_area']['autocomplete_text'],$len);
                }else {
                    $keyvalue= substr($valueproductname['Expertise_area']['autocomplete_text'],0,$pos)."<strong>"
                            .substr($valueproductname['Expertise_area']['autocomplete_text'],$pos,$len)."</strong>"
                            .substr($valueproductname['Expertise_area']['autocomplete_text'],$pos+$len);
                }


                $response[$i]['value']=$valueproductname['Expertise_area']['autocomplete_text'];
                $response[$i]['label']="<span class=\"username\">".$keyvalue."</span>";
                $i++;

            }
            echo json_encode($response);
        }else{
        }
}
}

私は少し調査しましたが、これまでのところ、次のソリューションを検討する価値があります。

  1. ページの読み込み時にデータをクエリし、将来使用できるように COOKIE に保存します。

  2. いくつかのキャッシング メカニズム (memcache??) を実装します。しかし、私のウェブサイトはCakephp上にあり、私が正しければ内部キャッシュを行います。したがって、この方向に進む価値はありますか。

  3. Solr、Lucene などのサードパーティのインデックス作成メカニズムを使用します。これについてはよくわかりません。

  4. 非常に複雑な「プレフィックス検索」を自分で実装する

それについて行く正しい方法は何ですか?ここで私を助けてください。

4

2 に答える 2

1

私はこれを試したことはありませんが、私が取り組んでいるプロジェクトのためにすぐにやります。

私は常に、最初のページの読み込み中に、各アルファベットの上位 10 語を AJAX で受信する (またはページに含めるだけである) 可能性を常に考えていました。

A - リンゴ、アノラック、アラスカ、アンジェラ、アハ、エア、アーグ、任意、アルファ、アメリカ B - バター、ボブなど...

このようにして、ユーザーが AZ を押すと、JS の配列に既に格納されているため、それ以上のリクエストなしで最も人気のある 10 個のキーワードを即座に提供できます。

サイズ/メモリ使用量はわかりませんが、これをさらに拡張して、最初の 2 文字を処理することができます。たとえば、AA、AB、AC.....BA、BB、BC....ZA、ZB、ZZ..もちろん、ZZで始まる単語などの多くの組み合わせは、音楽サイトでZZトップでない限り、データがありません。これは、最初のページの読み込み中にこのデータを送信するために、おそらくそれほど多くのメモリや帯域幅を消費しないことを意味します。ユーザーが 3 番目の文字を入力した場合にのみ、それ以上のデータ検索/転送を行う必要があります。

このデータは、サイトの使用状況と最も人気のある検索に応じて、毎日、毎週、または何でも自動更新します。

于 2013-08-15T05:48:40.597 に答える