【发布时间】:2013-08-15 05:41:17
【问题描述】:
我已经使用 jQuery 自动完成功能实现了一个基本的自动完成功能。我每次都在查询数据库,这使得自动完成的事情变得很慢。我正在寻找使它更快的方法,就像 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 上,如果我是对的,它会在内部进行 cahcing。那么是否值得朝这个方向发展。
使用一些第三方索引机制,如 Solr、Lucene 等。对此了解不多。
- 自己实现一个非常复杂的“前缀搜索”
什么是正确的方法?请帮帮我。
【问题讨论】:
-
在 DOM 加载时将所有可能的结果加载到一个变量中。不要使用 ajax。
-
@Ohgodwhy 我正在考虑这样做.. 但是将这些关键字存储在某处而不是每次都加载不是明智之举吗?如果是,那么最好的方法是什么? Cookie 还是会话?
-
CakePHP 以非常慢着称。它可以完成这项工作,但是如果您希望它非常快,那么您必须忘记框架并手动编写它。这不是很困难:创建一个PHP文件,打开一个db连接,搜索关键字并输出它。完毕。使用内存数据存储(如 memcache)可能会加快一些速度,但如果您的数据库设置正确,它应该能够处理它(例如,如果您使用索引并避免通配符搜索,MySQL 会非常快)。
-
@verri M. Olsen 如果我必须在字符串中显示任何匹配项而不仅仅是开始字符,那么有什么替代通配符搜索的方法?如何为它们生成索引?例如,如果用户输入“dev”,那么我必须显示“development”、“web development”、“social development”等。这让我的查询变慢了。
标签: php jquery caching autocomplete memcached