Разработка поиска по релевантности? - PullRequest
1 голос
/ 04 мая 2011

В моем приложении (PHP / MySQL / JS) встроена функция поиска. Один из критериев поиска содержит флажки для различных параметров, и поэтому некоторые результаты будут более релевантными, чем другие, если они будут содержать большеили меньше для каждого параметра.

т.е. параметры - это A и B, и если я ищу оба варианта A и B, результат 1, содержащий только параметр A, будет релевантным на 50%, а результат 2, содержащий оба параметраA и B имеют отношение на 100%.

До этого я просто выполнял простые SQL-запросы, основанные на вводе формы, но это немного сложнее, так как это не так просто, как data LIKE "%query% ", но, скорее, некоторые результаты более ценны для некоторых поисковых запросов, а некоторые нет.

Я понятия не имею, с чего начать ... У кого-нибудь есть соответствующие (ха!) материалы для чтениянаправить меня к?

Редактировать : Обдумав это, я подумываю кое-что о сценарии SQL для получения необработанных данных, за которым следует много-много циклов анализа.что я должен сделать ...

Ничего не кэшируется, правда?(

Ответы [ 4 ]

2 голосов
/ 04 мая 2011

взгляните на проект lucence доступно на многих языках

это порт php http://framework.zend.com/manual/en/zend.search.lucene.html

индексирует элементы для поиска и возвращает релевантные взвешенные результаты поиска, например, лучше выбрать x из y, где имя похоже на поиск в стиле '% pattern%'

1 голос
/ 04 мая 2011

Вот идея: сделайте сравнения и суммируйте результаты.Чем выше сумма, тем больше критериев соответствует.

Как насчет (глупой) таблицы, подобной этой:

  • name
  • dob_year
  • dob_month
  • dob_day

Найдите человека, который делится большинством из трех компонентов даты с 15.03.1980:

SELECT (dob_year = 1980) + (dob_month = 3) + (dob_day = 15) as strength, name
from user
order by strength desc
limit 1

Хорошее предложение и индекс WHEREможет потребоваться, чтобы вы не делали сканирование таблицы, но ...

Вы даже можете добавить вес к столбцу, например

SELECT ((dob_year = 1980)*2)

Удачи.

1 голос
/ 04 мая 2011

Вам нужен мощный поисковый движок, такой как solr.Хотя вы можете реализовать это поверх mysql, он уже поставляется из коробки с другими инструментами.

0 голосов
/ 04 мая 2011

Учитывая ваш ответ на мой комментарий, вот пример того, как вы можете это сделать:

Первые столы:

CREATE TABLE `items` (
 `id` int(11) NOT NULL,
 `name` varchar(80) NOT NULL
);
CREATE TABLE `criteria` (
 `cid` int(11) NOT NULL,
 `option` varchar(80) NOT NULL,
 `value` int(1) NOT NULL
);

Тогда пример некоторых предметов и критериев:

INSERT INTO items (id, name) VALUES
(1,'Name1'),
(2,'Name2'),
(3,'Name3');

INSERT INTO criteria VALUES
(1,'option1',1) ,(1,'option2',1) ,(1,'option3',0),
(2,'option1',0) ,(2,'option2',1) ,(2,'option3',1),
(3,'option1',1) ,(3,'option2',0) ,(3,'option3',1);

Это создаст 3 элемента и 3 параметра и назначит им параметры.

Теперь есть несколько способов сделать заказ на определенную «силу». Самый простой из которых будет:

SELECT i . * , c1.value + c3.value AS strength
FROM items i
JOIN criteria c1 ON c1.cid = i.id AND c1.option = 'option1'
JOIN criteria c3 ON c3.cid = i.id AND c3.option = 'option3'
ORDER BY strength DESC 

Это покажет вам все предметы, которые имеют опцию 1 или опцию 3, но те, у которых есть обе опции, будут иметь более высокий рейтинг.

Это хорошо работает, если вы делаете поиск по 2 вариантам. Но давайте предположим, что вы делаете поиск по всем 3 вариантам. Все предметы теперь имеют одинаковую силу, поэтому важно присваивать «веса» опциям.

Вы можете сделать ценность своей силой, но это может не помочь вам, если ваши запросы не всегда присваивают одинаковые веса одинаковым параметрам везде. Это может быть легко достигнуто для каждого запроса с помощью следующего запроса:

SELECT i.* , IF(c1.value, 2, 0) + IF(c3.value, 1, 0) AS strength
FROM items i
JOIN criteria c1 ON c1.cid = i.id AND c1.option = 'option1'
JOIN criteria c3 ON c3.cid = i.id AND c3.option = 'option3'
ORDER BY strength DESC

Попробуйте выполнить запросы и посмотрите, нужно ли вам это.

Я также хотел бы отметить, что это не лучшее решение с точки зрения вычислительной мощности. Я бы порекомендовал вам добавить индексы, сделать поле опций целым числом, по возможности кэшировать результаты.

Оставьте комментарий, если у вас есть какие-либо вопросы или что-то добавить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...