zoukankan      html  css  js  c++  java
  • sphinx应用

     sphinx调用原理

    只需要提交要查询,sphinx将返回唯一的id号

     API调用

    1.创建连接 

    $sphinx = new SphinxClient();
    $sphinx->SetServer ( 'loclahost', 9312 );//建立连接
    $sphinx->SetConnectTimeout(3);//连接超时时间,单位ms,0不限制
    $sphinx->SetMaxQueryTime(10);//最大查询时间 $sphinx->SetArrayResult ( true );//搜索结果以数组格式返回,否则为hash
    

      

    2.匹配查询

      (1)查询分页 

    $sphinx->SetLimits($offset, $limit, $max_matches);
    

      

      (2)设置查询模式

    $sphinx->SetMatchMode ( $mode );
    

      $mode--SPH_MATCH_ALL   匹配所有查询词(默认模式)

           SPH_MATCH_ANY  匹配查询词中的任意一个

           SPH_MATCH_PHRASE  将整个查询看作一个词组,要求按顺序完整匹配

           SPH_MATCH_BOOLEAN  将查询看作一个布尔表达式

           SPH_MATCH_EXTENDED  将查询看作一个CoreSeek/Sphinx内部查询语言的表达式 . 从版本Coreseek 3/Sphinx 0.9.9开始, 这个选项被选项SPH_MATCH_EXTENDED2代替,它提供了更多功能和更佳的性能。保留这个选项是为了与遗留的旧代码兼容

           
           SPH_MATCH_EXTENDED2  使用第二版的“扩展匹配模式”对查询进行匹配。该扩展匹配模式允许使用一些像mysql的条件语句

           SPH_MATCH_FULLSCAN, 强制使用下文所述的“完整扫描”模式来对查询进行匹配。注意,在此模式下,所有的查询词都被忽略,尽管过滤器、过滤器范围以及分组仍然起作用,但任何文本匹配都不会发生

          

      (3)设置排序模式

    $sphinx->SetSortMode ( $mode, $sortby="");
    

      $mode--SPH_SORT_RELEVANCE 模式, 按相关度降序排列(最好的匹配排在最前面)

           SPH_SORT_ATTR_DESC 模式, 按属性降序排列 (属性值越大的越是排在前面)

           SPH_SORT_ATTR_ASC 模式, 按属性升序排列(属性值越小的越是排在前面)

           SPH_SORT_TIME_SEGMENTS 模式, 先按时间段(最近一小时/天/周/月)降序,再按相关度降序

           SPH_SORT_EXTENDED 模式, 按一种类似SQL的方式将列组合起来,升序或降序排列。

           SPH_SORT_EXPR 模式,按某个算术表达式排序

        注:

          在SPH_SORT_EXTENDED 模式中,涉及的属性(包括内部属性)不能超过5个

          内部属性名字以@开头

          已知的内部属性:

              @id           匹配id

              @weight     匹配权值

              @rank     匹配权值

              @relevance  匹配权值

            @rank和@relevance是@weight的别名

      (4)结果集过滤

         A.ID过滤       

    $sphinx->SetIdRange($min, $max); 
    

        限制ID在某个范围内参数必须为整数,默认为(0,0)

          B.字段(属性)过滤

    $sphinx->SetFilter($attribute, $value,$exclude=false); 
    

      增加整数值过滤器

    $sphinx->SetFilterRange($attribute, $min,$max,$exclude=false);
    

      增加整数范围过滤器

    $sphinx->SetFilterFloatRange($attribute, $min,$max,$exclude=false);
    

      增加浮点数过滤器

      说明:

        $exclude为布尔值,true-接受匹配的文档,false拒绝

      (5) 执行查询    

    $sphinx->Query ( $query, $index="*" );
    

      $query查询字符串

      $index 包含一个或多个索引名的字符串,需要和sphinx端配置文件的索引名一致

      若发生错误,返回false并设置GetLastError()信息

      若返回成功,返回搜索的结果集,默认是hash。包含的键值:

        matches------hash表,存储文档ID以及其对应的另一个包含文档权重和属性值的hash表

        total----------此查询在服务器检索所得的匹配文档数

        total_found--索引中匹配文档的总数

        words---------一个hash,将查询关键字映射到一个关于关键字的统计数据的小hash表上

        error----------search的报告的错误信息。无错误,空串

        warning-------search的报告的警告信息。无警告,空串

        time-----------查询所需时间

        

    $res = $cl->Query("pen",'*');    
    if ( $res===false )
    {
    	print "Query failed: " . $cl->GetLastError() . ".<br/>";
    
    } else
    {
    	if ( $cl->GetLastWarning() )
    		print "WARNING: " . $cl->GetLastWarning() . "<br/>";
    
    	print "Query  retrieved $res[total] of $res[total_found] matches in $res[time] sec.<br/>";
    	print "Query stats:<br>";
    	if ( is_array($res["words"]) )
    		foreach ( $res["words"] as $word => $info )
    			print "    '$word' found $info[hits] times in $info[docs] documents<br/>";
    	print "<br/>";
    
    	if ( is_array($res["matches"]) )
    	{
    		$n = 1;
    		$matches = $res['matches'];
    		$ids = array_keys($matches);	
    		var_dump($ids);
    	}
    	
    }
    

     

    注:total_found 是在索引中找到的匹配总数,而 found 是返回的结果数

    3.输出结果

      (1)根据数组$ids从数据库获取信息

      (2)对信息进行过滤

        eg:去除标签

          strip_tags($string,$allow)

      (3)信息的处理

        eg:产生文档和关键词高亮

          $sphinx->BuildExcerpts($doc,$index,$words,$opts=array());

        说明:

          $doc   ---包含字符串的数组

          $index---包含索引名的字符串

          $words---包含需要高亮的关键词字符串

          $opts-----其他可选

            before_match-----在匹配关键词前插入字符串,默认<br>

            after_match-------在匹配关键词后插入字符串,默认</br>

            chunk_separator--在摘要块之间插入的字符串 ,默认…

            limit----------------摘要最多包含的符号数,默认256

            around-------------每个关键词块左右选取的词的数目,默认5

            exact_phrase------是否仅抽取最佳的一个段落

            

    4.异常处理

      (1)GetLastError()返回最近的错误信息

        

    if($sphinx->GetLastError()){
       var_dump($sphinx->GetLastError());
    }
    

      

      (2)GetLastWarning() 返回最近的警告信息

      

    if($sphinx->GetLastWarning()){
       var_dump($sphinx->GetLastWarning());
    }
    

      

    说明:

      (1)sphinx并不会返回像mysql那样的数据数组,因为sphinx本来就没有记录完整的数据,只记录被分词后的数据。

      所以要获取到真实数据还要根据matches中的ID去搜索mysql的表,但总体来说这样一来一回的速度还是远远比mysql的LIKE快得多,前提是几十万数据量以上,否则用sphinx只会更慢。 

      (2)修改配置完成后要重新建立索引才能生效

        

      

  • 相关阅读:
    把数据输出到Word (组件形式)
    把数据输出到Word (非插件形式)
    ASP.NET MVC Jquery Validate 表单验证的多种方式
    GitHub博客hexo建站之设置SSH 密钥(keys)
    文件打开模式和文件对象方法
    字符串的方法及注释
    汉诺塔递归思维
    python中for嵌套打印图形
    float存储
    Queue 笔记
  • 原文地址:https://www.cnblogs.com/baby123/p/5880293.html
Copyright © 2011-2022 走看看