第10课:搜索

搜索产生了很多伟大的公司,google,百度等;现在甚至很多人工智能领域的专家都把目光投到搜索,致力于实现智能化,人性化的搜索

搜索也在实际项目中应用很多
简单的数据库模糊查询不再多说,实用价值不大
现在的主流解决方案主要是先对搜索词处理,去掉无意义的词语,然后进行分词,拆分成若干标签
然后用搜索引擎

1.数据库搜索,模糊查询
like '%要查询字段%' 
PHP例子:
$bind[':user_name'] = '%www.godeye.org%';
$sql = 'select id, name from user where name like :user_name';
return Mysql::getInstance('slave')->fetchAll($sql, $bind);
但是并不实用,首先因为只是进行生硬的匹配查询结果很差,其次效率很低

2.开源搜索引擎
2.1 sphinx coreseek  coreseek是对sphinx的封装,加入了中文分词,对中文支持比较好,但是版本很久都没有更新了
2.2 xunsearch 一款优秀的开源搜索引擎,对PHP支持非常的好

在实际应用中,一般都是用sphinx的实时索引,保证索引与所依赖的数据库表的实时关系
搜索引擎还是要依赖数据库表的,不能单独存在

以sphinx为例,一般都是用sphinxQl来写入索引数据,语法与mysql相仿,读取常用API

sphinx的PHP api举例
<?php
//查询操作
if ($_GET['type'] == 'sphinx') {
    ini_set('display_errors', 'On');
    include 'lib/sphinx/sphinxapi.php';//加载Sphinx API
    $sc = new SphinxClient(); //实例化Api
    $sc->SetServer('10.21.3.101', 9312); // 设置服务端,第一个参数sphinx服务器地址,第二个sphinx监听端口
    $sc->SetArrayResult(true);
    $sc->SetFilter('t2', array(36668, 36451, 21027, 27819, 21385, 20972));
    $sc->SetLimits(0, 2000, 6000);//分页查询
    $sc->SetConnectTimeout(3);//连接超时时间(非常必要,比如sphinx服务器挂了等异常情况)单位为s,秒
    $sc->SetMaxQueryTime(10);//最长运行时间
    $res = $sc->Query('', 'Godeye'); //执行查询,第一个参数查询的关键字,第二个查询的索引名称,mysql索引名称(这个也是在配置文件中定义的),多个索引名称以,分开,也可以用*表示所有索引。

    //////删除操作  SphinxQl
    if ($_GET['do'] == 'del') {
        if ($res) {
            $mysql = new PDO('mysql:host=10.21.3.101;port=9306;dbname=null', '', '');
            foreach ($res['matches'] as $v) {
                $ids[] = $v['id'];
            }
        }
        $delid = implode(',', $ids);
        $sql = "delete from Godeye where id in (" . $delid . ")";
        $stmt = $mysql->prepare($sql);
        $res = $stmt->execute();
        echo $stmt->rowCount();
        exit;
    }
    $err = $sc->GetLastError();//获取错误信息,调试用
}

打赏  如对你有帮助,请我喝杯咖啡吧!