mysql 和sphinx搜索引擎及分词库的关系说明

  • 公司用的是coreseek搜索引擎,搜索河南,不会显示河南省,让我解决这个问题;

  • 首先看里面的分词库内容


    mysql 和sphinx搜索引擎及分词库的关系说明_第1张图片
    image.png
  • 再分析搜索引擎建立索引的原理发现

    • 分词是以 1 结尾的,在建立索引的时候,分词都会作为索引树的节点建立,如果你搜河南,那么就在 河南这个节点 往下搜索 ,如果你搜河南省,就会在河南省的节点往下搜索,而河南,河南省这两个分词不在一个节点,索引搜索河南是出不来河南省的.如果你搜索的不在分词库中,则会以单个字为分词进行搜索,导致搜索结果不准确

    • 解决方案:以coreseek为例,coreseek其实是spinx+mmseg3分词库 结合的,那么我可以通过更改分词库的手段来删除不必要的节点/分词

    • 如转化体 是不存在这个词的,默认会分开搜索,转 化 体 三个字搜索,结构往往和预期不能匹配

    • 方法操作如下:


      image.png
    • 编辑里面的unigram.txt文本,增加或者删除你的分词,这里附上我过滤县的一段代码

//处理文本,过滤掉省结尾的省份,市结尾的市区,县结尾的县

//武功县   1   13
$file="./unigram.txt";
$result="./result.txt";
$fh1=fopen($file,"r");
$fh2=fopen($result,"w");
//var_dump($fh);die;

while (!feof($fh1)){
    $line=fgets($fh1);
    $start= strripos($line,"县");
    if($start>5){
        $line=substr_replace($line,"",$start,"3");
    }

    fwrite($fh2,"$line");
}
fclose($fh2);
fclose($fh1);
  • 编辑完毕后 运行
 /usr/local/mmseg3/bin/mmseg  -u /usr/local/mmseg3/etc/unigram.txt  
 生成新的词库,这个时候
/usr/local/mmseg3/etc 目录下会生成一个unigram.txt.uni 文件,
替换lib文件   mv unigram.txt.uni   uni.lib
至此,分词修改完毕,下一步是重新生成索引 ,
1.暂停索引服务
 /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf --stop
2.重新生成索引
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate
3.开启服务
/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf,
整个编辑完毕

你可能感兴趣的:(mysql 和sphinx搜索引擎及分词库的关系说明)