(本文原作于2016年11月3日,点击访问原文)
最近在对一个Django+Mysql的小网站进行性能优化,发现一些有趣的事,记录于此。
首先是中文全文搜索的问题。比较新的Mysql是可以创建全文索引并且进行全文搜索的,但对汉语的支持不好。英语天然地用空格分割单词,很容易实现全文搜索,但汉语却没有这样的天然优势。一个自然的想法便是若汉语的词与词之间也有空格分割,岂不是就可以直接用Mysql的全文索引和全文搜索了。为此,对需要进行全文搜索的字段,比如title和description,新建两个对应的字段用于存放带空格的中文句子:title_index和description_index。然后遍历整张表,读取title和description字段的值,对其进行汉语分词(比如使用jieba)后用空格分割分词结果,分别写回到title_index和description_index字段中去。可以用类似下面的Python代码去实现这一过程(注意下面的代码只是片段,是不完整的)。
#使用execute方法执行SQL语句
cursor.execute('''select id,title,description from tablename''')
for row in cursor.fetchall():#遍历整张表
#建立全文索引
if row[1]:
title_index = ' '.join(list(jieba.cut(row[1]))).replace("\"", "'")
else:
title_index = ''
if row[2]:
description_index = ' '.join(list(jieba.cut(row[2]))).replace("\"", "'")
else:
description_index = ''
sql = '''update tablename set