【问题标题】:Weighted Search Algorithm for PHPPHP的加权搜索算法
【发布时间】:2011-11-20 09:02:07
【问题描述】:

问题

我在一个表中有 5 个项目[1],每个项目有 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);

【问题讨论】:

    标签: php mysql algorithm search weighted


    【解决方案1】:

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

    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 => 蓝色权重等...

    【讨论】:

    • 我刚刚尝试过,但它实际上不起作用 - Unknown column 'w1' in 'field list'
    • 去掉括号,用@rx变量代替它在php中的真实值
    • 它有效,在你的 mysql 客户端试试这个:select (5 * 4) AS mult ;
    【解决方案2】:

    把它加起来

    <?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.
    ?>
    

    【讨论】:

      【解决方案3】:

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

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

      Algorithms of the Intelligent Web

      Programming Collective Intelligence: Building Smart Web 2.0 Applications

      【讨论】:

        【解决方案4】:

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

        $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);
         ...
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-12
          • 2013-10-26
          • 2013-04-16
          • 1970-01-01
          • 2011-08-16
          • 2012-07-30
          相关资源
          最近更新 更多