Алгоритм взвешенного поиска для PHP - PullRequest
2 голосов
/ 19 сентября 2011

Проблема

У меня есть 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);

Ответы [ 4 ]

3 голосов
/ 19 сентября 2011

Рассчитать пунктуацию поиска как поле и отсортировать запрос по нему

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 => синий вес и т. Д. ...

1 голос
/ 19 сентября 2011

Извините, но у меня нет прямого ответа. Это очень интересная тема. Вы можете использовать что-то, связанное с евклидовым расстоянием или корреляцией Пирсона. Вы можете найти больше в книгах, связанных с Коллективным разумом.

Конечно, реализовать такие вещи сложнее, но ваши результаты мы будем намного точнее и точнее. Я рекомендую эти книги:

Алгоритмы Интеллектуальной Сети

Программирование Коллективного разума: создание приложений Smart Web 2.0

1 голос
/ 19 сентября 2011

просто сложите

<?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.
?>
0 голосов
/ 19 сентября 2011

Я не уверен, правильно ли я понимаю, что вы имеете в виду, но как на счет этого:

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