0

我有一个我认为是相当简单的 SphinxQL 查询,但事实证明 @ 变量已被弃用(参见下面的示例)

SELECT *,@weight AS m FROM test1 WHERE MATCH('tennis') ORDER BY m DESC LIMIT 0,1000 OPTION ranker=bm25, max_matches=3000, field_weights=(title=10, content=5);

我觉得必须有一种方法可以按匹配强度对结果进行排序。什么是替代品?

另一方面,如果出现某些其他词,我想在其中包含贬值怎么办。例如,假设我想贬低包含“服装”一词的结果。可以在同一个查询中执行吗?

谢谢!

4

1 回答 1

1

好吧,结果是“默认”的重量下降,所以就这样做......

SELECT * FROM test1 WHERE MATCH('tennis') LIMIT 0,1000 OPTION ... 

但除此之外,它,只是 @ 变量,被“函数”取代,主要是因为它更像“SQL”。所以@weightWEIGHT()

SELECT * FROM test1 WHERE MATCH('tennis') ORDER BY WEIGHT() DESC ...

或者

SELECT *,WEIGHT() AS m FROM test1 WHERE MATCH('tennis') ORDER BY m DESC ...

作为参考,@group是, @count 是,@distinct 是,@geodist是,@ expr并没有真正等价物,要么直接使用表达式,要么使用您自己的自定义命名别名。GROUPBY()COUNT(*)COUNT(DISTINCT ...)GEODIST(...)


至于第二个问题。有点棘手,它们并不是真正的“负”权重。Ther 是一个关键字 boost 运算符,但目前还不能使用它来专门贬值。

我认为它可能起作用的唯一方法是,如果负匹配是针对特定领域的,则可以建立一个复杂的排名表达式。基本上作为负权重,需要一个特定字段作为排名表达式,因此可以用来选择该列

... MATCH('@!(negative) tennis @negative apparel') 
... OPTION ranker=expr('SUM(word_count*IF(user_weight=99,-1,1))'), field_weights(negative=99)

这是一个非常基本的演示表达式,用于说明目的,真实的可能会复杂得多。它只是显示使用 99 作为“负”乘法的占位符。需要negative创建新字段,这可能只是其他字段的副本

于 2017-07-13T21:46:30.247 回答