您的位置:首页 > 编程语言 > PHP开发

迅搜(XunSearch)+ThinkPHP5实现标题的拼音或拼音首字母缩写搜索

2017-03-13 00:00 369 查看
摘要: 这两天在学迅搜全文搜索引擎,但貌似拼音搜索不是很准确?是我没找到方法?还是不能?不管了,还是自己做一个吧。

这是两年前学习Coreseek时在问答区问的一个问题:

https://www.oschina.net/question/252582_173810

当时只是想了下,但没去做,现在学迅搜,又想到这个问题,干脆还是试试把它给做了吧 ^_^

1、数据表字段



2、ThinkPHP5的model里做 py_whole 和 py_acronym 的自动完成

<?php
namespace app\xxx\model;
use think\Model;
use search\XunSearch;// 参照迅搜官方给 Yii 1 写的类弄的一个TP扩展类

class Xxx extends Model
{

protected $auto = ['py_whole', 'py_acronym'];

// 自动设置拼音全拼
protected function setPyWholeAttr()
{
// 获取title
$title = $this->getAttr('title');
if (empty($title)){
return '';
}
// 先对title分词
$xs = new XunSearch('recipe');
$keyword_list = $xs->getScws()->getTokens($title);

// 再对title分的每一个词转换成拼音
$pinyin = [];
if (count($keyword_list)>0){
foreach ($keyword_list as $keyword){
$keyword_pinyin = gbk_to_pinyin($keyword);// 这里用PHPCMS里般过来的转拼音函数转换
if (is_array($keyword_pinyin) && count($keyword_pinyin)>0){
$pinyin[] = implode ( '' ,  $keyword_pinyin );
}
}
}
if (count($pinyin)>0){
return implode(' ', $pinyin);// 迅搜里的配置分割方式默认是空格,这里也就用空格了
}else{
return '';
}
}

// 自动设置拼音首字母缩写
protected function setPyAcronymAttr()
{
$title = $this->getAttr('title');
if (empty($title)){
return '';
}
// 先对title分词
$xs = new XunSearch('recipe');
$keyword_list = $xs->getScws()->getTokens($title);
$pinyin = [];
if (count($keyword_list)>0){
foreach ($keyword_list as $keyword){
$keyword_arr = mb_str_split($keyword);// 字符进行逐字分割,这是一个自定义函数,解决PHP自带函数不能分割中文问题
// 提取拼音首字母缩写
$keyword_initial = array_map(function( $word ){
$pinyin = gbk_to_pinyin($word);
return substr( $pinyin[0], 0, 1 );
}, $keyword_arr);

if (is_array($keyword_initial) && count($keyword_initial)>0){
$pinyin[] = implode ( '' ,  $keyword_initial );
}
}
}

if (count($pinyin)>0){
return implode(' ', $pinyin);// 迅搜里的配置分割方式默认是空格,这里也就用空格了
}else{
return '';
}
}
}

数据入库时就可以得到这样的结果



3、迅搜的项目配置文件里这样配置

project.name = xxx

[id]
type = id

[title]
type = title

[py_whole]
index = mixed
tokenizer = split

[py_acronym]
index = mixed
tokenizer = split

4、测试效果(表中只有30条测试数据,所以结果不多)

public function testxs()
{
$xs = new \search\XunSearch('recipe');
$keyword = 'mb';
dump('关键词: '.$keyword);
$list = $xs->search($keyword, '', 0, 10);
dump('查询语句: '.$xs->getQuery());
dump($list);
}




5、用SQL语句验证迅搜的结果与数量对不对



不错,比用迅搜的 getExpandedQuery() 方法转换得到的拼音准确多了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ThinkPHP PHP XunSearch
相关文章推荐