2016-07-26

MariaDB 全文索引

MariaDB 和 MySQL 的全文索引的建立方式与查找方式,都和普通的索引不同。

建立索引

建立索引的语法可以简单也可以复杂:

FULLTEXT(title)
FULLTEXT(title,content)
FULLTEXT INDEX post_title_content_ft_index(title,content)

查询

1. 按照自然语言查询,匹配完整单词。比如查询 rabbit 可以匹配 rabbit, rabbits, Rabbits,但是查询 rab 不能匹配 rabbit 。

MATCH(title,content) AGAINST('rabbit')

2. 按照字符匹配查询,从单词开头开始。查询 rab 可以匹配 rabbit ,但是查询 bit 不能匹配 rabbit 。

MATCH(title,content) AGAINST('rabbit' IN BOOLEAN MODE)

多列索引与单列索引

对于普通的索引,如果建立了(title,content)的联合索引,就不必单独建立 title 和 content 的索引,也可以搜索单列。但是全文索引就不行,索引的列必须和查询的列完全一致。如果查询 title ,就要建立 title 单列的全文索引;如果查询 (title, content) 就要建立只包含 (title, content) 两列的索引。

搜索中文

MySQL 和 MariaDB 的全文索引一开始就不是为东亚语言设计的。单词断字是按照空格和标点符号的,但是中日韩文字单词之间没有空格。因此搜索“明月”无法匹配“床前明月光”。使用 IN NATURAL LANGUAGE MODE 只有在搜索整句的时候才能匹配到,基本上没有什么用处。使用 IN BOOLEAN MODE 的时候,只能搜索一句的开头,比如“床前*”可以匹配,而“明月*”就不行。* 通配符只能放在单词的结尾。

因此对中文而言,全文索引反而没有 %LIKE% 的效果好,虽然 %LIKE% 的效率很低。小型网站,可以采用。

MySQL 提供了额外的 ngram 技术,支持每 n 个字符断字。这样就可以用逐字搜索中日韩文字。但 MariaDB 还没有引进此功能。

2016-07-21

一天又一天

近一个月来,都在忙创业的工作。网站推出开始运行,逐渐积累内容和用户。也不是特别出彩,但也像模像样的。

santakani.com

万事开头难。得时时想着这件事,偶尔跳出圈子,才能理清头绪。工作的时候也不是要拼多少小时,而是每天坚持做一点,做最要紧的,选择最高效的途径。

前几天参加一个小活动,有个大叔说,“Do not fall in love with what you are doing.”意思是说要灵活变通,最后做成的事,不总是和初衷完全一致的。

看着一点点积累了这么多,有点小开心。感谢玥辛和小童。我们这三个人好像都不够聪明,不是特别勤奋,也没啥经验。只是一直在慢慢往前走。

毕业临近,稍有紧迫之感。同一届的学生,都还没有毕业。有的在忙毕业设计,有的则在实习。在芬兰,人们已经习惯了按照自己的节奏规划生活。社会也有足够的包容性,不会计较你是否早一年或晚一年毕业。

好好学习,好好玩耍。