免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2866 | 回复: 4
打印 上一主题 下一主题

如何实现类似google的多关键词查询(多关键词用空格或其它符号间隔),并求最高效率 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-21 17:05 |只看该作者 |倒序浏览
如何实现类似google的多关键词查询,要求查询效率最高
当空格或+号时是 and 运算
当-号时是 非 运算
当|号时是 or 运算

分解关键词后,用哪种运算方式效率最高呢?
1. 用N个like 条件
2. 用in(a,b,c)
3. 用全文检索技术
4. 用正则表达式

===================================
假如有一个表
CREATE TABLE `article` (
        `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
        `title` VARCHAR( 255 ) NOT NULL ,
        `descript` TEXT NOT NULL ,
        `content` LONGTEXT NOT NULL ,
        PRIMARY KEY ( `id` ) ,
        INDEX ( `title` ) ,
        FULLTEXT (`title` ,`descript` ,`content`)
);

目的:
要查询 key_a,key_b,key_c 在 title,descript,content(这三个字段视为一个整体) 中同时存在或排除某关键词

如 客户端输入"key_a key_b key_c"(情况一)或 "key_a key_b -key_c"(情况二)
我们针对这两种情况该如何写SQL语句呢?

===================================


集思广益,请大家给出具体的程序段及函数,谢谢。

论坛徽章:
0
2 [报告]
发表于 2006-02-21 22:44 |只看该作者

  1. <?php
  2. /**
  3. * $kw 用户输入的关键词组合 i.e: 'php 操作 - 手册'
  4. * 运行该代码片段之后将生成 $and , $or , $except 三个数组存放相应关键词
  5. *
  6. * 说明这个实现办法主要是依靠字符串分析,
  7. * 也无考虑个别GBK码的低位刚好是 '|+-' 的情况, 可以尝试用正则来处理
  8. */

  9. $kw = strtolower($kw);
  10. $kw = preg_replace("/\s+/s", " ", $kw);
  11. $rep = array(" and " => "+", " or " => "|", " + " => "+", " | " => "|", " - " => "-", " " => "+");
  12. $kw = strtr($kw, $rep);

  13. $and = array();
  14. $or = array();
  15. $except = array();

  16. $len = strlen($kw);
  17. $tmp = "";
  18. $var = "and";

  19. for ($i = 0; $i < $len; $i++) {
  20.     if ($kw[$i] == '+') {
  21.         if (!empty($tmp))
  22.             array_push(${$var}, $tmp);
  23.         $var = "and";
  24.         $tmp = "";
  25.     }
  26.     else if ($kw[$i] == '-') {
  27.         if (!empty($tmp))
  28.             array_push(${$var}, $tmp);
  29.         $var = "except";
  30.         $tmp = "";
  31.     }
  32.     else if ($kw[$i] == '|') {
  33.         if (!empty($tmp))
  34.             array_push(${$var}, $tmp);
  35.         $var = "or";
  36.         $tmp = "";
  37.     }
  38.     else
  39.         $tmp .= $kw[$i];
  40. }

  41. if (!empty($tmp)) array_push(${$var}, $tmp);

  42. // 处理完成得到 $and, $or, $except 三个数组
  43. print_r($and);
  44. print_r($or);
  45. print_r($except);
  46. ?>
复制代码

论坛徽章:
0
3 [报告]
发表于 2006-02-21 23:18 |只看该作者
谢谢hightman兄,但还有一个重要的问题没有实现。

用php得出keyword数组后,运用哪种mysql查询方式才是最高效率的呢?

论坛徽章:
0
4 [报告]
发表于 2006-02-22 11:48 |只看该作者
如果用 LIKE 来匹配的话效率肯定不高甚至很差, 全部遍历...

可以试试 MYSQL 自带的 FULLTEXT 索引.  具体用法参看手册吧

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2006-02-22 11:50 |只看该作者
使用FULLTEXT,最好用utf8字符集
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP