使用Django-haystack时,避免直接从数据库查询

小型站点的全文检索,Django-haystack+Whoosh+Jieba(若是中文),是一个好的方案,刚开始打算用Sphinx(不是那个文档系统)或者Lucene来实现,N年前做某大型钢铁交易平台时用的是Sphinx,但发现了django-haystack,对一个中小网站来说足够了。

在观测性能的时候发现一个现象,就是检索查询结果的时候大量的请求数据库,而且是随着数据的增多,连接数越来越多。。。这可不成啊,虽然不是大网站,但是性能问题还是要考虑滴。

解决方案:

在查询的模板HTML文件里,不要使用系统的ORM对象,比如{{ object.user.girl_friend.the_best_friend.cup_size }}这种对象写在模板里,是万万要不得的,这会直接向多个数据表请求数据,哪怕你用了select_related,你打开查看sql语句看一下,那sql语句的数量会让你内牛满面的。

那怎么办呢?

想好搜索结果,直接在search_indexes.py里合成成html片段,search.html(假设你的查询模板叫这个名字)里只使用search_indexes.py里的索引字段来返回查询结果,就ok了。

啊 :
王二麻子 :
For example, "name@something.com". If someone replies to you it will be via email.
For example, "http://someaddress.com"