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{
}
}
}
私は少し調査しましたが、これまでのところ、次のソリューションを検討する価値があります。
ページの読み込み時にデータをクエリし、将来使用できるように COOKIE に保存します。
いくつかのキャッシング メカニズム (memcache??) を実装します。しかし、私のウェブサイトはCakephp上にあり、私が正しければ内部キャッシュを行います。したがって、この方向に進む価値はありますか。
Solr、Lucene などのサードパーティのインデックス作成メカニズムを使用します。これについてはよくわかりません。
- 非常に複雑な「プレフィックス検索」を自分で実装する
それについて行く正しい方法は何ですか?ここで私を助けてください。