迅搜(XunSearch)+ThinkPHP5实现标题的拼音或拼音首字母缩写搜索
2017-03-13 00:00
369 查看
摘要: 这两天在学迅搜全文搜索引擎,但貌似拼音搜索不是很准确?是我没找到方法?还是不能?不管了,还是自己做一个吧。
这是两年前学习Coreseek时在问答区问的一个问题:
https://www.oschina.net/question/252582_173810
当时只是想了下,但没去做,现在学迅搜,又想到这个问题,干脆还是试试把它给做了吧 ^_^
1、数据表字段
2、ThinkPHP5的model里做 py_whole 和 py_acronym 的自动完成
数据入库时就可以得到这样的结果
3、迅搜的项目配置文件里这样配置
4、测试效果(表中只有30条测试数据,所以结果不多)
5、用SQL语句验证迅搜的结果与数量对不对
不错,比用迅搜的 getExpandedQuery() 方法转换得到的拼音准确多了
这是两年前学习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() 方法转换得到的拼音准确多了
相关文章推荐
- 用dedecms实现拼音显示文章标题页文件名的方法
- 根据查询的关键字,实现获取百度指定页数的搜索结果的信息(网页地址,标题,摘要,并有排序的说明)
- Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音 .
- Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
- Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
- dede实现拼音显示文章标题页文件名
- Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
- Android实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
- Android实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
- Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
- 让Dedecms自带搜索实现全文检索(支持标题与内容)
- php根据汉字获取拼音(php基于拼音搜索实现原理)
- 实现新闻搜索功能:用户输入关键字,用来匹配新闻标题或内容。
- Android实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
- Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
- 基于postgres的应用软件的拼音搜索实现
- SQL SERVER中的汉字转拼音-实现根据拼音搜索汉字
- jquery实现仿select列表的即时搜索及拼音搜索
- php根据汉字获取拼音(php基于拼音搜索实现原理)
- Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音