JBTALKS.CC

标题: MYSQL 中文全文搜索问题 [打印本页]

作者: 宅男-兜着走    时间: 2011-7-6 09:56 PM
标题: MYSQL 中文全文搜索问题
如题, 中文不能全文搜索。

有什么solution。

看百度 基本上是说存 区位码, 然后全文搜索区位码。

问题是, 什么是区位码??
作者: 宅男-兜着走    时间: 2011-7-6 09:59 PM
回复 1# 宅男-兜着走


    EXAMPLE :

TABLE PEOPLE
_____________________________
     ID | NAME |
      1    你老爸
_____________________________


sql : SELECT * FROM people WHERE MATCH(name) AGAINTS('你' IN BOOLEAN MODE);
作者: weeming21    时间: 2011-7-7 08:01 AM
本帖最后由 weeming21 于 2011-7-7 08:11 AM 编辑

因为中文字都是连在一起,不像英文,每个word都用空格来分开,所以全文搜索不怎么理想
搜索例子:你老爸
数据库资料:我是你的老爸

这种情形,你用match就无法找到了,因为他会把“你老爸”当成一个字来找

所以可以把中文分词处理后再进行全文搜索
原始方法是把 你老爸 =〉分割成: 你老 老爸
但是这种方法占用空间很大
所以网上可以找到很多字典,自动分割
最理想的是 你老爸 =〉 你 老爸

这样的话就能 match ... AGAINTS('你* 老爸*' IN BOOLEAN MODE) 了

我用到dede的字典不错,你不妨搜索看看  “dedecms 分词”
作者: ~Zero    时间: 2011-7-7 10:45 AM
我的 SQL search 都是用 like 的不是用 match,中文是没问题,你可以试试。
  1. SELECT * FROM table WHERE column LIKE '*word*'
复制代码

作者: weeming21    时间: 2011-7-7 12:11 PM
回复 4# ~Zero

不管是match或like,如果搜索一段文字,没有分词,返回的结果就很少

搜索 “新山电脑店” 如果没有分词,直接带进like query,那么 "新山的电脑店" 这行数据就找不到了
作者: ~Zero    时间: 2011-7-7 12:41 PM
回复  宅男-兜着走


    EXAMPLE :

TABLE PEOPLE
_____________________________
     ID | NA ...
宅男-兜着走 发表于 2011-7-6 09:59 PM

楼主的问题还没要到分词的那个复杂阶段,所以用 like 就可以解决了。
搜索 ‘你’ 是可以得到 ‘你老爸’ 的。
作者: 宅男-兜着走    时间: 2011-7-7 10:27 PM
本帖最后由 宅男-兜着走 于 2011-7-7 10:31 PM 编辑

回复 6# ~Zero


    也许我的example误导了你, 是酱的其实   我要做的是站内 货品搜寻。

    Table ITEM:
   id         name                   desc
_______________________________________
1            平子洋装              从日本进口, 整体长得像和服 ....



所以我要搜寻的 关键词:

“日本洋装 , 日本和服 ,  平子样装”

等字句。 因为牵涉到不同的 搜寻关键字, 复杂的模糊搜寻。 我们不知道 使用者会key 什么。
单单 LIKE %% 是不行的

或许 LIKE 搜寻 用在 MIS 类会比较合适
我不会为了能用 LIKE %% 解决的东西来开帖的

所以我需要的是
2进制分段, 区位码 来储存, 这样的话, 就能用 MATCH 来搜寻判断区位码, Scoring。 然后 Sort Scoring.

但是问题是 !!!! 我不懂怎么 切分中文字, 也不懂怎么转换区位码。 中国网站的看不懂。太乱了。
作者: 宅男-兜着走    时间: 2011-7-7 11:14 PM
回复 3# weeming21


    hi ,weeming 你给的东西是我要的。
    但是还有个问题。
   
    我用了 dedecms 分词库。 比较常用的是 转换成 base64 入库,但是我不想转换成 base64  , 看起来比较长, 比较肥大的感觉。
    对于 区位码, 你了解吗?
作者: weeming21    时间: 2011-7-7 11:44 PM
本帖最后由 weeming21 于 2011-7-7 11:46 PM 编辑

回复 8# 宅男-兜着走

不需要转成区位码,分词后直接进 match 应该就可以了吧,不过dedecms的分词好像只支持 gbk
这就要看你站点的中文是用gbk还是utf8了

utf8 example
  1. <META http-equiv="Content-Type" content="text/html; charset=utf8" />
  2. <?php
  3. require("lib_splitword_full.php");
  4. $str = "这里是你要的分词系统";
  5. iconv( 'UTF-8', 'gb2312//IGNORE' , $str);
  6. $sp = new SplitWord();//实例化
  7. $dd =implode(" ",array_unique(explode(" ",iconv( 'gb2312', 'UTF-8//IGNORE' , $sp->SplitRMM($str)))));
  8. echo $dd;
  9. ?>
复制代码
其实市面上还有其他的分词,discuz也有一个分词,但是是live的,要connect到discuz.net去进行分词
如果你有服务器权限,或者能自定义.so,那么可以选择这个分词系统,速度快
http://www.hightman.cn/index.php?scws
作者: 宅男-兜着走    时间: 2011-7-7 11:54 PM
回复 9# weeming21


    嗯 ... 基本上我没服务器权限。 所以dd 比较适合我。
   
    刚才试用了下, 要载入词库, 出来的效果是有还不错下。不过分词过程有点小慢   
    太可怕了吧
作者: 宅男-兜着走    时间: 2011-7-8 12:20 AM
回复 9# weeming21


    http://www.itgrass.com/phpanalysis/?ac=done

我也看到个不错的分词库了

还能分析新词(没很准确)

速度快。
支持 UTF-8 charset
http://www.itgrass.com/phpanalysis/?ac=done

看看下吧。

谢谢你的分享。




欢迎光临 JBTALKS.CC (https://jbtalks.my/) Powered by Discuz! X2.5