【问题标题】:sphinx search math operation between fieldssphinx 搜索字段之间的数学运算
【发布时间】:2013-07-10 05:42:00
【问题描述】:

由于我正在转向 sphinx 搜索引擎以提高我的网站性能,我正在尝试将旧的 mysql 查询翻译成新的 sphinx 语言。

重点是根据对我的帖子的投票和每次投票的得分(从 1 到 5)之间的数学运算对结果进行排序。

例如,如果我对某个帖子投了 3 票,我得到了 1=5 点投票 2=3 点和 3=2 点投票,我的表格将包含一个名为 votes 的字段,整数 = 3 (votes=3)和一个整数为 5+3+2(points=10)的字段。

因此,此类帖子的最终评分将是积分/投票,在本例中为 10/3=3,333...

假设我使用 sphinx api 按降序获取评分最高的帖子列表,这是我在 php 脚本中使用的旧 mysql 查询:

mysql_query("SELECT * FROM table ORDER BY points/votes DESC LIMIT $start,$stop");

我尝试构建一个 sphinx 查询,但它不工作并且总是给出 0 个结果。请仔细阅读描述我所做的所有尝试的 // 注释行。

require("sphinxapi.php");
$cl = new SphinxClient;
$index = index;
$cl->setServer("localhost", 9312);
$cl->SetMatchMode(SPH_MATCH_FULLSCAN);
//$cl->SetSortMode(SPH_SORT_EXTENDED, 'IDIV(points,votes) DESC'); //not working
//$cl->SetSortMode(SPH_SORT_EXTENDED, '(points DIV votes) DESC'); //not working
//$cl->SetSortMode(SPH_SORT_EXTENDED, 'points/votes DESC'); //not working
//$cl->SetSortMode(SPH_SORT_EXTENDED, '(points/votes) DESC'); //not working
$cl->setLimits($start,$stop,$max_matches=1000);
$query = "";

请您帮我找出问题所在...谢谢。

【问题讨论】:

  • 使用算术表达式需要使用SPH_SORT_EXPR
  • 我已经尝试过 SPH_SORT_EXPR,结果确实为零
  • 它不会影响您的选择 排序如何给您 0 个结果?
  • 实际上我认为我的 sphinx 配置有问题。是否可以对 sphinx 中的 sql_field_string 执行算术运算?因为如果我在文档 $id 或 @weight 上执行 SPH_SORT_EXPR 通常是有效的,但是当我尝试对任何其他字段(通常是 bigint 字段)进行任何数学运算时,它会给出 0 个结果。

标签: php full-text-search sphinx


【解决方案1】:

您需要使用SPH_SORT_EXPR

$cl->SetSortMode(SPH_SORT_EXPR, '(points/votes) DESC');

【讨论】:

    【解决方案2】:

    首先你需要积分和投票是Attributes,而不是fields。属性存储在索引中,可用于排序等。算术只能对数字属性(而不是字符串)执行

    SPH_SORT_EXPR 的正确语法(假设您已经拥有属性)是

    $cl->SetSortMode(SPH_SORT_EXPR, 'points/votes');
    

    SPH_SORT_EXPR 总是递减,所以最后不需要 DESC。

    但是,与其让 sphinx 每次都计算该比率,不如在 sql_query 期间进行更好的计算并将其存储为单个数字属性。提示:存储为整数,而不是浮点数。整数的排序效率更高。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 2013-03-03
      相关资源
      最近更新 更多