`
ljl_xyf
  • 浏览: 630454 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Sphinx全文检索引擎的排序问题

阅读更多

如果不想使用权重,只希望严格按照时间、主键等排序,而匹配模式(Matching modes)又为非SPH_MATCH_BOOLEAN时(比较常用的是SPH_MATCH_ALL、 SPH_MATCH_EXTENDED),Sphinx搜索结果在某一页中的排序会不太准确。例如:按照UNIX时间戳倒序排序,0,20为第一 页,20,40为第二页,第一页的最小时间戳一定会大于第二页的最大时间戳,但是,第一页中的0,20条记录却不会严格按照时间戳排序,第二页亦是如此。 因此,如果需要精确排序,用户翻到搜索结果的某一页,就需要对Sphinx在某一搜索结果页中的记录另行再排序。


具体实现的PHP代码如下:

首先,需要设置匹配模式为 $this->sphinx->SetMatchMode ( SPH_MATCH_BOOLEAN );

其次,设置排序规则:$this->sphinx->SetSortMode( SPH_SORT_EXTENDED, "pub_date DESC, @id DESC" );

最后,对分页之后返回的结果数组进行一个完全倒序,问题就可以解决了。




代码如下:


<?php

class CSearch{

public $sphinx; //sphinx对象指针

public $indexer; //在指定的索引中查询关键词

public $keyword; //查询关键词

public function CSearch(){
$this->sphinx = new CSphinx;
$this->sphinx->SetFieldWeights( array( "title" => 10, "content" => 5 ) );
$this->sphinx->SetMatchMode ( SPH_MATCH_BOOLEAN );
$this->sphinx->SetSortMode( SPH_SORT_EXTENDED, "pub_date DESC, @id DESC" );

}

/*
<summary>全文检索的查询入口</summary>
<params>
<keyword>将要检索的关键词</keyword>
<offset>返回的结果是从第$offset条开始输出的</offset>
<limit>返回的结果中,每页显示10条数据</limit>
<indexer>在指定的索引中检索关键词</indexer>
</params>
*/
public function query( $keyword, $offset = 0, $limit = 10, $indexer = "articles" ){
$returned = new stdClass;
$this->indexer = $indexer;
$this->keyword = $keyword;
$this->sphinx->SetLimits( $offset, $limit );
$results = $this->sphinx->query( $keyword, $indexer ); //在指定的索引中检索关键词,并将符合条件的结果集放在$results变量中
$returned->total = $results["total"]; //符合条件的结果条数
$returned->time = $results["time"]; //查询所耗费的时间,单位:秒
$article_ids = array_keys( $results["matches"] ); //符合条件的文章ID数组
unset( $results ); //释放sphinx查询所创建的结果集对象
if( empty( $article_ids ) ){
$returned->data = Array();
return $returned;
}   
$data = $this->get_data( $article_ids ); //获取文章数据
$this->get_formated_data( $data, "content" ); //获取格式化之后的数据:产生文档片段(摘要)
$this->get_formated_data( $data, "title" ); //获取格式化之后的数据:产生文档片段(摘要)
$returned->data = array_reverse( $data );
return $returned;
}

/*
<summary>根据文章ID数组获取文章标题、作者、日期、guid和正文</summary>
<params>
<article_ids>文章ID数组</article_ids>
</params>
*/
public function get_data( $article_ids ){
return get_content_from_ids( $article_ids );
}

/*

*/
public function get_formated_data( &$data, $field = "content" ){
//$opts为包含其他可选的高亮参数的hash
$opts = Array();
$opts["single_passage"] = true; //是否仅抽取最佳的一个段落。布尔值。
$opts["before_match"] = '<span class="c_orange">'; //在匹配的关键字前面插入的字符
$opts["after_match"] = "</span>";
$opts["limit"] = 160; //摘要最多包含的符号(码点)数。整数
$contents = Array();
foreach( $data as $item ){
$item = trim( strip_tags( $item[$field] ) );
$contents[] = preg_replace( "/[\r\t\n]+/", "", $item );
}
$contents = $this->sphinx->buildExcerpts($contents, $this->indexer, $this->keyword, $opts );
foreach ($data as $k => &$v) {
$v[$field] = $contents[$k];
}
return $data;
}

}

?>

分享到:
评论

相关推荐

    PHP 全文检索引擎 Sphinx 介绍

    Sphinx是一个高性能、开源的全文检索引擎,专为配合SQL数据库而设计,如MySQL和PostgreSQL,用于实现高效且专业的全文搜索功能。它的核心优势在于能够提供比数据库原生搜索更强大的搜索性能,并且易于集成到各种使用...

    基于PHP的Sphinx全文检索引擎php版forWindows源码.zip

    标题中的“基于PHP的Sphinx全文检索引擎php版forWindows源码.zip”表明这是一个用于Windows操作系统的PHP版本的Sphinx全文检索引擎的源代码包。Sphinx是一个高性能、可扩展的全文搜索引擎,常用于Web应用中,以提供...

    基于PHP的Sphinx全文检索引擎php版 for Windows.zip

    标题 "基于PHP的Sphinx全文检索引擎php版 for Windows.zip" 暗示了这是一个针对Windows操作系统的Sphinx全文搜索引擎的PHP接口版本。Sphinx是一个开源的、高性能的全文搜索引擎,广泛应用于网站内容搜索和数据索引。...

    archive_ Sphinx全文检索引擎 for Mac v3.3.1 [江西新余电信].zip.zip

    Sphinx是一款高效、开源的全文检索引擎,专为网站数据搜索设计。它的主要目标是提供快速、相关性高的全文检索功能,并且具有低延迟、高并发处理能力。在Mac平台上,Sphinx同样能够发挥出其强大的性能,为开发者提供...

    archive_ Sphinx全文检索引擎 for Windows v3.3.1 [江西新余电信].zip.zip

    Sphinx是一款高效、开源的全文检索引擎,设计用于提供快速、准确的全文搜索功能。它在许多网站和应用中被广泛使用,特别是那些需要大量数据搜索能力的场合,如内容管理系统、论坛、电子商务平台等。Sphinx的核心特性...

    archive_ Sphinx全文检索引擎 for Linux v3.3.1 [江西新余电信].zip.zip

    Sphinx 是一个高性能的全文检索引擎,主要用于构建高效、可扩展的搜索解决方案。在这个压缩包“archive_ Sphinx全文检索引擎 for Linux v3.3.1 [江西新余电信].zip.zip”中,包含了Sphinx在Linux环境下的版本3.3.1。...

    Sphinx基于SQL的全文检索引擎简介

    它由俄罗斯开发者Andrew Aksyonoff创建,最初是为了解决数据库的全文检索问题而设计的。Sphinx以其快速、准确和可扩展性而闻名,广泛应用于网站、博客、论坛等平台的后台搜索。 Sphinx的核心特性包括: 1. **高速...

    sphinx全文搜索引擎

    Sphinx全文搜索引擎是一款高效、可定制的开源全文检索引擎,主要设计用于网站后台提供快速、准确的全文搜索功能。它最初由俄罗斯开发者Andrew Aksyonoff开发,现在已经成为许多大型网站和应用程序的重要组成部分,...

    基于PHP的Sphinxphp全文检索引擎forLinux源码.zip

    标题中的“基于PHP的Sphinxphp全文检索引擎forLinux源码.zip”指的是一个使用PHP语言开发的、适用于Linux操作系统的全文检索引擎——Sphinx。Sphinx是一款高效、强大的开源搜索引擎,设计用于处理大量数据,提供快速...

    基于PHP的Sphinx php全文检索引擎 for Linux.zip

    这个“基于PHP的Sphinx php全文检索引擎 for Linux.zip”压缩包很可能是包含了在Linux环境下使用PHP与Sphinx进行全文检索所需的所有文件和配置。 首先,Sphinx的核心功能是全文索引,它能够对文本进行预处理,包括...

    PHP实例开发源码—Sphinx php全文检索引擎 for Linux.zip

    在本资源中,我们关注的是一个专为Linux系统设计的PHP全文检索引擎——Sphinx。Sphinx是一款高效、可扩展的开源全文搜索引擎,它能够与PHP紧密结合,为Web应用程序提供强大的搜索功能。以下是对Sphinx及其与PHP集成...

    Sphinx全文检索引擎for Linux v2.0.6

    Sphinx全文检索引擎是一款高效、灵活且功能强大的开源搜索引擎,主要设计用于Web应用程序,提供快速的全文检索能力。在Linux环境下,Sphinx v2.0.6是该软件的一个稳定版本,它支持PHP源代码集成,非常适合那些需要...

    基于Sphinx+MySQL的千万级数据全文检索

    【基于Sphinx+MySQL的千万级数据全文检索】的架构设计着重解决大数据量下的高效全文检索问题。Sphinx是一款源自俄罗斯的开源全文搜索引擎,它在处理海量数据时表现出极高的性能和可扩展性。在DELL PowerEdge 6850...

    Lucene基于Java的全文检索引擎简介

    随着技术的发展,市场上出现了更多全文检索引擎的选择,例如Sphinx。相较于Lucene,Sphinx具有以下优势: - **更高的搜索速度:** Sphinx专门优化了搜索性能,适合对实时性要求较高的场景。 - **内置中文分词支持:*...

    关于Sphinx创建全文检索的索引介绍

    Sphinx是一个非常强大的开源全文搜索引擎,支持全文检索和搜索功能,它由俄罗斯人Andrew Aksyonoff开发,适用于大量的数据索引和高速搜索。全文检索的索引创建是Sphinx的一项核心功能,它能够有效地存储和快速检索...

Global site tag (gtag.js) - Google Analytics