为什么80%的码农都做不了架构师?>>>   

确实有很多方法来给php提供全文索引功能。

例如:

1。solr或者lucene,(需要安装对应的php客户端扩展)。

2。sphinx

3。基于任何一个数据库(key/value的最好)的模拟实现。

4。Mysql的全文索引。

5。自己给php加上全文索引扩展。(就因为这一点,可以说有太多的实现方法了)

本文要介绍的是第四种,使用MySQL的全文索引来实现php的全文检索功能。

一。前提

MySQL数据表引擎要是MyISAM (Mysql的ISAM索引结构的实现)

二。准备:

假设建立如下一个简易的文章表格:

+------+---------+-----------+--------------------------------------+
| Id   | title   | author    |  content    | c_idx(text,fulltext)      |
+------+---------+-----------+------------------------------------+

其中content为原文,c_idx为中文分词后的base64编码串接字符串,并且为fulltext索引。

请看下文。

三。实现分析:

1。如果要被检索的内容是英文的,那么要做的事情很简单,给要检索的字段加上一个fulltext索引就可以了。

2。如果被检索的内容是CJK字符集合或者是CJK和英文的混合的话那问题就来了。(我们都知道,MySQL的全文索引不支持中文分词)。

能不能把分词之后中文转换成英文呢?

对,我就是这么想的:

将文章内从content字段的内容进行中文分词,然后将得到的词条转换成英文,再将转换后的词条使用空格串接起来,写入数据库即可。

这需要解决两个问题:

(1).中文分词:

这是搜索引擎的难点之一。速度和准确率是其瓶颈所在。

这里我推荐本人的开源php中文分词扩展robbe,robbe是建立在开源高性能中文分词组建friso上的一个php扩展。也是鄙人的作品。分词速度和准确率都不错。

(2).将中文字符串转换成英文字符串:

使用什么编码呢?想来想去,试来试去,发现base64编码最适合了。(如果有发现更好的编码,请比吝赐教测叫,在此先谢了)。

base64的编码和解码速度都很快。

另外编码后的文本所占的空间比编码前的文本只多一点(比原来长1/3)。

(另外,base64编码后的字符串中可能会包含+和/字符,会影响要MySQL对英文分词,所系需要手动替换一下)

四。具体实现:

<?php
$content = $_POST['content'];  //过滤什么的,就是你的事情啦。//1.使用复杂模式,对文本进行分词。
//@see robbe文档 https://code.google.com/p/robbe/wiki/RobbeFunctions
$_result = rb_split($content, __RB_COMPLEX_MODE__);//2.进行base64编码,并且使用空格串接分词结果。
$_str = '';
foreach ( $_result as $_value ) {$_str .= ' '.base64_encode($_value);
}//3.写入文本到fulltext数据表中。
?>

1.查询SQL:

select 字段列表 from #_table where Match(c_idx) Against(检索字符串);或者:select #_files, Match(c_idx) Against(检索字符串) AS rank from #_table order by rank

返回的结果是自动根据相关度排序的。

2.或者使用bool模式:

select #_files from #_table where Match(c_idx) Against(检索字符串 IN BOOLEAN MODE)

常用布尔操作符:

+    包含,词必须存在。

-    排除,词必须不出现。

>    包含,而且增加等级值

<    包含,而且减少等级值

()    吧词组合成一个表达式。

~    取消一个词的排序值。

*    词尾通配符。

""    定义一个短语。

例如:

select content from article where Match(c_idx) Against('+你好的base64编码字符串 +我们的base64编码字符串' IN BOOLEAN MODE)

查询包含你好和我们的记录。

-----------------------------------------------

select content from article where Match(c_idx) Against('你好的base64编码字符串 我们的base64编码字符串' IN BOOLEAN MODE)

查询至少包含“你好”和“我们”中的一个的记录。

-----------------------------------------------

select content from article where Match(c_idx) Against('“你好的base64编码字符串 我们的base64编码字符串”' IN BOOLEAN MODE)

搜索匹配短语:“你好 我们”

-----------------------------------------------

select content from article where Match(c_idx) Against('>你好的base64编码字符串 <我们的base64编码字符串' IN BOOLEAN MODE)

匹配“你好”和“我们”,并且增加“你好”的等级,减少“我们”的等级。

3.使用查询扩展:4.11或者更高版本才支持。

select #_files from #_table where Match(c_idx) Against(检索字符串 WITH QUERY EXPANSION)

五。效率分析:

对于一般数据来的网站,例如:个人博客,企业文章,新闻什么的,(60W以下的数据记录条数)

使用此方法可以比较好的解决搜索问题,但是数据量大时,并不是很好的解决办法。

30W的数据记录(平均大小10K),平均查询0.02sec的样子。还算不错吧。

索引的内容不一定是全文(即c_idx字段的内容),可以是人工筛选后的核心性词组合。那样可以达到更好的检索效果和更快的检索速度。

转载于:https://my.oschina.net/jcseg/blog/111106

robbe+base64+Mysql简易有效的php全文索引实现相关推荐

  1. Navicat操作MySQL简易教程

    前言: 日常使用 MySQL 的过程中,我们可能会经常使用可视化工具来连接 MySQL ,其中比较常用的就是 Navicat 了.平时也会遇到某些同学问, Navicat 怎么安装,如何使用等问题.本 ...

  2. php mysql收款系统下载_php+mysql简易扫码付教育收费系统 v1.2

    Php+MySql简易教育查询与收费系统适用预设金额的学校学费收费,物业小区水电费收费等场景.用户查询自己的金额信息后扫码支付. 管理员在后台导入用户及金额信息,可查看用户支付列表(可搜.可删改.有分 ...

  3. mysql 中文字段名_MySQL全文索引怎么做?| 教程分享

    - 点击上方"爱数据学习社"关注我们吧! - 文末领取[商业分析资料] 为什么要用全文索引 我们在用一个东西前,得知道为什么要用它,使用全文索引无非有以下原因: like查询太慢. ...

  4. mysql基础语法之(全文索引)

    1.概要 InnoDB引擎对FULLTEXT索引的支持是MySQL5.6新引入的特性,之前只有MyISAM引擎支持FULLTEXT索引.对于FULLTEXT索引的内容可以使用MATCH()-AGAIN ...

  5. Mysql 简易入门

    文章目录 1.数据库 1.1.数据库分类 1.2.DBMS(数据库管理系统) 1.3.MySQL 1.4.安装 MySQL 1.5.SQLyog / navicat 连接.. 1.6.数据库连接 2. ...

  6. mysql简易oa系统_基于mybatis设计简单OA系统问题2

    1. 标签用于格式化数字,百分比,货币. 教程: 2.错误: org.apache.jasper.JasperException: An exception occurred processing J ...

  7. nodejs mysql save_NodeJs Mysql简易操作工具

    /** * npm install mysql -save */ var mysql = require('mysql'); const conf = { host: 'localhost', use ...

  8. mysql简易购物车系统_基于PHP+Mysql简单实现了图书购物车系统的实例详解

    基于PHP+Mysql简单实现了图书购物车系统的实例详解,购物车,这是,页面,简单,图书 基于PHP+Mysql简单实现了图书购物车系统的实例详解 易采站长站,站长之家为您整理了基于PHP+Mysql ...

  9. web课设 thinkphp5+mySQL 简易教学管理系统

    教学管理系统 需求 结果展示 登录界面 学生界面 教师界面 管理员界面 数据库设计 E-R图 实现 一.文件创建 二.前端界面 三.数据库设置 四.控制器 五.前端返回信息处理 ajax简单入门 需求 ...

  10. C语言操作MYSQL简易教程

    文章目录 一.连接MYSQL 连接实例 1.MYSQL *mysql_init(MYSQL *mysql) 2.int mysql_library_init(int argc,char **argv, ...

最新文章

  1. oracle instr函数 收藏
  2. mysql工具的使用_产品操作MySQL入门篇-工具使用
  3. 压缩图片上传到数据库
  4. python如何输入多行数据合并_python 实现将txt文件多行合并为一行并将中间的空格去掉方法...
  5. 反向传播网络(BP 网络)
  6. 计算机应用基础第3次平时作业,计算机应用基础第3次作业.doc
  7. matlab调和均值滤波_MatLab 自编的 均值滤波、中值滤波、高斯滤波 图像处理函数...
  8. English 900 英语九百句
  9. 易语言操作安卓无障碍免root群控框架源码
  10. myscript 思路整理
  11. 学会网页制作,web开发,你需要掌握这3个编程语言
  12. 以编程会安全,以安全辅未来——2017看雪安全开发者峰会 强势来袭!
  13. 【python学习.油价和美元汇率查询】
  14. sysbench官网
  15. 泰山OFFICE技术讲座:全网首发:中文字体,字号就是中文字符的宽度
  16. iOS 网络请求劫持
  17. pyspider显示web太小
  18. pjSIP注册呼叫流程简介
  19. 学校招聘行政老师的计算机能力测试,【】计算机教师招聘试题(25页)-原创力文档...
  20. c语言面向对象编程显示,c语言面向对象编程

热门文章

  1. 题解 P3835 【【模板】可持久化平衡树】
  2. 如何从右键弹出菜单中清空删除数据加清空前提问确定
  3. TortoiseGit保存用户名及密码
  4. Noip2008提高组初赛 C
  5. 修改系统文件内容的经典错误总结
  6. C#窗体控件-文本框控件TextBox
  7. MySQL中的四种Key
  8. 线程同步(互斥锁与信号量的作用与区别)
  9. 企业级 SpringBoot 教程 (七)springboot开启声明式事务
  10. rollup打包js的注意点-haorooms博客分享