PHP 实现简单搜索功能

方案:问答搜索

1. 搜索结果列表,高亮显示搜索关键词内容

2. 用户输入内容,点击搜索        2.1 获取用户的搜索内容;        2.2 调用分词服务,获取对搜索内容的分词;        2.3 先查询是否已经存在这些关键词内容的缓存,有则直接取结果;否,进行下一步;        2.4 如果 2.2 返回的分词数大于 5 个,则取 5 个关键词的问答帖子交集,判断数量是否 >= 30 条;        不够,则逐次丢弃最后的关键词,再次进行查询,直到关键词的个数减到只有 1 个为止;                2.4.1 对 2.4 中的多次结果进行去从,以及进行帖子的权重计算        (            问答帖子的质量计算:                Q = α * T + β * S + γ * A , α = 0.2 , β = 0.5 , γ = 0.3 ;                 T - 时间; S - 点赞数 ; A - 回答数;                T = (当前的时间秒戳 - 帖子的发帖时间) / 7*86400;        )            2.5 将 2.4 中的问答结果写入 Redis ,10 分钟失效;(key - hnb:qa:search_result , 帖子)        2.6 读取 2.5 Redis 结果,展示到页面

 // 问答搜索
    public function getQuestionBySearch($arr_keyWords , $arr_keyWeight , $start , $num)
    {
        $arr_temple_keyWords = $arr_keyWords;

        count($arr_keyWords) > 8 ? $len = 8 : $len = count($arr_keyWords);

        // redis 中的 key 值
        $key = ‘hnb:qa:search:qa_score:‘ . implode(‘_‘ , array_splice($arr_temple_keyWords , 0 , $len));

        // 读取 redis 中 key = hnb-search:‘关键词‘,... 有没有缓存.
        $exists = Hnb_Model_Qa_Question_Cache::getInstance()->existsKey($key);

        if($exists)
        {
            $arr_questionInfo = unserialize($exists);

        } else {

            $arr_questionInfo = array();
            $arr_question_ids = array();
            $arr_label_in_question = array();
            do{

                $arr_keyWords = array_splice($arr_keyWords , 0 , $len--);
                $arr_result = Hnb_Model_Qa_Question_Cache::getInstance()->getSearchRelativeQuestion($arr_keyWords , $start , $num);

                // 问答帖子
                foreach($arr_result as $question)
                {
                    // 去掉重复的问答
                    if(!in_array($question[‘id‘] , $arr_question_ids))
                    {
                        $arr_question_ids[] = $question[‘id‘];

                        // 权重计算
                        $question[‘score‘] = pow(2 , $len);
                        $this->_logicQaWeight($question , $arr_keyWords , $arr_keyWeight);
                        $arr_questionInfo[] = $question;
                    }
                }

            } while((count($arr_questionInfo) < 100) && $len);

            // 存在数据时
            if($arr_questionInfo)
            {
                // 权重排序
                //uasort($arr_questionInfo , array($this , ‘cmp‘));
                usort($arr_questionInfo , array($this , ‘cmp‘));
                // 保存临时数据
                //Hnb_Model_Qa_Question_Cache::getInstance()->saveTempleData($key , $arr_questionInfo , $timeOutSecond = 600);
                // 设定该临时数据的失效时间
            }
        }

        return $arr_questionInfo;
    }

    // 按帖子的权重排序
    private function cmp($a , $b)
    {
        if($a[‘score‘] == $b[‘score‘])
        {
            return 0;
        }
        return ($a[‘score‘] > $b[‘score‘]) ? -1 : 1;
    }
    // 问答帖子的权重计算逻辑
    private function _logicQaWeight(&$questionInfo , $arr_keyWords , $arr_keyWeight)
    {
        $a = 0.2;    // 发帖时间
        $b = 0.5;    // 点赞数
        $c = 0.3;    // 回复数
        //$d = ..;     // 匹配度因子
        $b = $c = 0;
        $timeLine =  30 * 86400; // 

        $minus = time() - $questionInfo[‘create_time‘];

        // 向下取整
        $t = floor($minus / $timeLine);

        $tParam = 2 * pow(0.5 , $t);
        // 用户回答
        $user_answers = Hnb_Model_Qa_Answer::getInstance()->getAnswerInfoByQuestion($questionInfo[‘id‘]);
        // 顾问回答权重计算
        if($user_answers)
        {
            is_string($user_answers) ? $user_answers = unserialize($user_answers) : ‘‘;
            $praise_num = null;
            foreach($user_answers as $answer)
            {
                $praise_num += $answer[‘praise_num‘];
            }
        } else {
            $praise_num = 0;
        }

        // 匹配度因子计算
        $this->_matchingQARate($questionInfo , $arr_keyWords , $arr_keyWeight);

        $weight = $a * $tParam + $b * $praise_num + $c * $questionInfo[‘answer_num‘];
        $questionInfo[‘all_praise_num‘] = $praise_num;
        $questionInfo[‘keywords‘] = implode(‘,‘ , $arr_keyWords);
        $questionInfo[‘params‘] = ‘时间-‘ . ($a * $tParam) . ‘##tParam-‘ . $tParam. ‘## 点赞数-‘ . ($b * $praise_num) . ‘## 回复数-‘ . ($c * $questionInfo[‘answer_num‘]);
        $questionInfo[‘score‘] = $questionInfo[‘score‘] + $weight;
        //print_r($questionInfo);
    }

    // 帖子的匹配度
    public function _matchingQARate(&$questionInfo , $arr_keyWords , $arr_keyWeight)
    {
        // 1. 发送搜索内容到分词服务

        $arr_kwIntersect_result = array_intersect($arr_keyWords , $questionInfo[‘keyword‘]);
        echo ‘交集‘;
        print_r($arr_kwIntersect_result);
        // 2. 获取到返回的分词与权重
        $arr_format_wordInfo = Hnb_Model_Search::getInstance()->formatWordInfo($questionInfo[‘keyword2‘]);

        // 帖子关键词的权重,注意次序
        $w = array();
        foreach($arr_format_wordInfo as $wordInfo)
        {
            if(in_array($wordInfo[‘keyword‘] , $arr_kwIntersect_result))
            {
                $w[] = $wordInfo[‘weight‘];
            }
        }

        // 搜索内容分词的权重,注意次序
        $y = array();

        foreach($arr_keyWeight as $weightInfo)
        {
            if(in_array($weightInfo[‘keyword‘] , $arr_kwIntersect_result))
            {
                $y[] = $weightInfo[‘weight‘];
            }
        }

        print_r($w);
        echo ‘<br />‘;
        print_r($y);
        echo ‘###############‘;
        $element = null;
        foreach($w as $key => $v)
        {
            $element += $v * $y[$key];
        }
        echo $element;

        // 3. 与搜索出来的帖子做交集

        // 4. 计算帖子的匹配度

        /*
        *     计算公式:
        *       3 中的交集作为分子
        *      3 中的帖子与 2 的分词权重
        */
    }
时间: 2024-12-25 09:43:09

PHP 实现简单搜索功能的相关文章

java简单的实现搜索框的下拉显示相关搜索功能

最近做了一个简单的搜索框下面下拉显示相关搜索的功能,有点模仿百度的下拉展示相关搜索 先上个展示图 : 点击进入演示地址,大家可以输入长点的搜索,点击搜索,再输入之前搜索词的前面部分,看是否能展示出来 搜索框相关搜索的展示很简单,就是根据你的搜索词,去数据库中匹配,是否有类似的搜索词存在,按照搜索词被搜索的次数进行排序显示出来 我设计的是每次搜索一个词,提交之后都会去数据库进行查询,看是否存在这个搜索词的搜索,若存在,则对数据库中的这个搜索词对象进行次数加1,不存在,则创建这个新搜索词对象,保存在

ios UISearchDisplayController 实现 UITableView 搜索功能

UISearchDisplayController 是苹果专为 UITableView 搜索封装的一个类. 里面内置了一个 UITableView 用于显示搜索的结果.它可以和一个需要搜索功能的 controller 关联起来,其它的像原 TableView 和搜索结果 TableView 的切换, mask 的显示等等都 封装好了,使用起来非常非常的简单.特别是要实现全屏搜索时使用最多. 全屏搜索的意思是如果你用了  NavigationBar 当点击搜索框时 TableView 会自动弹上去

Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音

转载请注明出处:http://blog.csdn.net/xiaanming/article/details/12684155 前段时间因为换工作的缘故又恰巧碰到国庆节,所以有段时间自己没有更新博客了,过完国庆到新公司报道,感觉还不错,就是现在住的地方离新公司有点远,地铁20站,伤不起啊,我每天早上7点多就要起床,然后屁颠屁颠的去挤地铁上班,晚上下班还要挤地铁,先不说路程远,车费一天就要10几块,我的银子啊,有坐龙华线去上班的深圳程序员不?听说那条线上班高峰期很挤?我没在上班高峰期坐过那趟车,我

js搜索框实现自动搜索功能

做项目的时候,老板让我自己封装一个搜索功能,就类似于百度这种 输入了字符之后,就可以自动搜索数据,而且还会出现一个下拉框供用户选择,我觉得我老板有问题,网上有这么多插件,不仅封装好了,性能也做了优化,什么功能都有,他不用,一定要我用原生js写,写毛线写,我内心吐槽了很久,不过还是要做,为了工资而低头,所以我这个小白就硬着头皮写完了,肯定有很多不足,也没有封装,就是想到哪里写到哪里,给大家当反面教材看看,如果大家看见了,也可以指点指点我,让我进步 由于我是在项目里写的,所以有很多东西和大家的肯定不

dedecms 搜索功能实现及下拉栏目

如果你不会dedecms 搜索功能  请对自己说dedecms dedecms 搜索功能很简单,很简单,真的很简单!! 按步骤来说明吧 1 , 找到下载解压出来的原版dedecms 源代码  /uploade/plus/search.php search.php 文件 把他放到项目中去与上面的路径一样(一般都会有的没有了在放) 2 , 然后创建一个search.htm 文件(这里他是用来展示搜索的内容search.htm 与search.php 是对应关系不用 考虑路径问题) 3 , 最重要的一

angular的仿百度搜索功能

尝试一下调用百度的搜索功能,这部分主要是练习$http. 首先HTML部分: <div ng-app="myApp" ng-controller="Aaa""> <input type="text" ng-model="name" ng-keyup="change(name)" placeholder="请输入搜索内容">//内容的搜索框 <inp

Android搜索功能的案例,本地保存搜索历史记录......

开发的APP有一个搜索功能,并且需要显示搜索的历史记录,我闲暇之余帮她开发了这个功能,现把该页面抽取成一个demo分享给大家. 实现效果如图所示:  本案例实现起来很简单,所以可以直接拿来嵌入项目中使用,涉及到的知识点: - 数据库的增删改查操作 - ListView和ScrollView的嵌套冲突解决 - 监听软键盘回车按钮设置为搜索按钮 - 使用TextWatcher( )实时筛选 - 已搜索的关键字再次搜索不重复添加到数据库 - 刚进入页面设置软键盘不因为EditText而自动弹出 代码

android5.0系统设置搜索功能简析

一.目的: 简单介绍系统设置搜索功能实现,初步熟悉搜索数据库构建规则以及匹配逻辑. 二.相关问题解答 1.系统设置可对那些设置项进行构建搜索数据库? 答:系统设置对数据项的构建规则在com.android.settings.search.SearchIndexableResources类中进行定义,例如如下,将wifi设置,wifi高级设置设置项假如搜索数据匹配库. sResMap.put(WifiSettings.class.getName(), new SearchIndexableReso

SharePoint 搜索功能失效

今天继续跟大家分享一个 SharePoint的故障问题,是关于 SharePoint 搜索功能失效的一个问题. 有一天,我们突然发现,SharePoint 2016的搜索功能无法使用了,如下图 然后在服务器的系统日志里面看到了大量的报错. 其实遇到这个问题,我们第一时间都会想到先去检查 Search 服务 我们打开计算机的 services.msc 服务管理面,查看下面两项服务是否启动. 然后登陆SharePoint 管理控制台来查看应用服务 检查一下 Search Service Applic