2

问题

我在表[1]中有 5 个项目,每个项目有 4 个属性(红色、绿色、蓝色、黄色)。
每个属性都可以被赋予 1 到 9 [2]之间的分数。

在我的网站上执行搜索时,用户可以通过给每个属性一个介于 1 到 9 之间的分数来指定每个属性与搜索结果的相关程度。

我应该使用什么算法来根据用户偏好计算和排序结果?

资源

[1] -CREATE TABLE items( id INT NOT NULL AUTO_INCREMENT , name VARCHAR(128) , red INT , green INT , blue INT , yellow INT , PRIMARY KEY (id) );

[2] -INSERT INTO items (NAME, red, green, blue, yellow) VALUES ('Random 1', 4, 1, 9, 4), ('Random 2', 1, 1, 2, 9), ('Random 3', 5, 7, 6, 3), ('Random 4', 2, 2, 8, 1);

4

4 回答 4

3

将搜索标点计算为字段并按它对查询进行排序

SELECT *, (red * @rw) AS w1, (green * @gw) AS w2, (blue* @bw) AS w3, (yellow * @yw) AS w4, (w1 + w2 + w3 + w4) AS result 
  FROM items ORDER BY result DESC; 

@rw => 红色重量,@bw => 蓝色重量,等等...

于 2011-09-19T15:51:20.530 回答
1

对不起,但我没有直接的答案。这是一个非常有趣的话题。您可以使用与欧几里得距离或皮尔逊相关性相关的东西。您可以在与集体智慧相关的书籍中找到更多信息。

当然,实现这样的事情会更加困难,但是您的结果我们会更加准确和精确。我推荐这些书:

智能网络的算法

编程集体智能:构建智能 Web 2.0 应用程序

于 2011-09-19T16:00:52.173 回答
1

把它加起来

<?php
require('connect.php') //your db connection data
$redWeight=$_REQUEST['howeverYouPassedTheRedWeighting'];
$blueWeight=$_REQUEST['howeverYouPassedTheBlueWeighting'];
$yellowWeight=$_REQUEST['howeverYouPassedTheYelloWeighting'];
$greenWeight=$_REQUEST['howeverYouPassedTheGreenWeighting'];
$query="SELECT name, ( red*$redWeight+green*$greenWeight+blue*$blueWeight+yellow*$yellowWeight ) AS value FROM items ORDER BY value DESC";
$res=mysql_query($query);
//etc.
?>
于 2011-09-19T15:54:17.080 回答
0

我不确定我是否理解你的意思,但是这个怎么样:

$user_defined_relevance = array ('red' => 1, 'blue' => 3, 'green' => 2, 'yellow' => 7);
arsort($user_defined_relevance); //this sorts the array by value descending while maintaining index association

$query = 'SELECT * FROM items ORDER BY '.implode(array_keys($user_defined_relevance), ',  DESC');
//will make SELECT * FROM items ORDER BY yellow DESC, blue DESC, green DESC, red DESC;
mysql_query($query);
 ...
于 2011-09-19T15:55:49.657 回答