1. 为什么要使用sphinx
在实际开发中,对于大文本的字段,例如(text、varchar),在做查询的时候,一般我们会使用模糊查询,这个时候,如果是like %name%这样的查询,这个时候索引就会失效。
好比商品名称查询:
# select * from tableName where goods_name like "%苹果%";(%出现在关键字的最左边 索引失效 但是"苹果%"这样不失效。)
但是使用这种 like "%关键字%"做模糊的场景非常多,比如做一个歌曲网站按照歌词做模糊查询,但是这时候如果使用 like "%关键字%" 形式就不会使用到索引查询.
解决方案:采用sphinx中文分词技术
2. sphinx介绍
由于sphinx是俄国人的开发,默认只支持俄文和英文。这个时候有一家做中文分词的公司对sphinx进行二次开发形成一个产品,叫做coreseek(中文版的sphinx)。
注意:对于shpinx来说查询速度都是毫秒级别,速度非常快
coreseek是一款基于sphinx开源的搜索引擎,专门为用户提供免费的中文全文检索系统,coreseek被称为带有中文分词的sphinx,与sphinx不同的是coreseek增加了一个带有中文分司的词库
注意:默认sphinx只支持英文和俄文
sphinx官网:http://sphinxsearch.com/
由于Sphinx只支持以上两种语言(英文和俄文),所以有第三方公司为sphinx开发了中分分词包,叫做coreseek
coreseek官网:http://www.coreseek.cn/
另外在中国有一家做的比较好的中文分词公司叫做海量公司
海量公司官网:http://www.hylanda.com/
面试技巧:
3. 中文分词的理解
中文分词:指的是将一个汉字序列切分成一个一个单独的词
英文分词比较简单实现,英文是以空格做区分的。 i am a boy.
例子:
中文分词:炎热的夏天
人的思维:炎热 夏天 (两个词)
程序思维: 炎,炎热,炎热的.的夏天,夏天 (程序分词是基于字频法)
字频法:常见的汉字词语出现的概率是有规律可寻的。
比如拿一本书来说:全部的内容做一次排序或者搜索,会发现很多词语都是重复的。
例子:你好、吃饭了吗、我等你、干什么等词语出现的次数满足一定的频率。把这些词语进行分词形成形成一个分词词典。再一次对这些词语做分词的时候,就去词典里面查找,如果找到了就说明有该词语的相关分词.
但是:对于一些专业词汇(化学,物理,法律),这个需要专门的人去做分词的词典。这个时候是要收费的。
如在百度搜索输入以下关键字擦查询:
2. 使用php操作sphinx
php操作sphinx的原理图
具体使用sphinx
①把课件中的sphinx复制到自己任意的一个目录(D:/)并且重命名为sphinx
②打开复制过去的sphinx的目录的etc目录,复制一份配置文件为songs.conf
③构建歌曲数据,导入mysql中
④打开刚才复制配置文件songs.conf,做以下修改
源配置(source)
index索引的配置:
内存分配:
⑤.给sphinx创建索引文件:
⑥开启sphinx的服务
帮助手册:
开启服务(注意此黑窗口不要关闭):
小测试(php操作sphinx)
①复制接口文件(sphinxapi.php)到网站目录下面
②新建一个文件demo.php连接sphinx
取出匹配到的记录id,组装成字符串形式:
3. 案例-歌曲查询系统:
使用技术:Ajax+sphinx实现:
服务端代码:
ajax获取的核心代码:
最终效果: