2011-05-04 3 views
1

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

т.е. Варианты А и В, и если при поиске для обоих вариантов А и В, 1 Результат, содержащий только вариант А составляет 50% Релевент, в то время как результат 2, содержащий оба варианта А и В составляет 100% отношение.

приор, я бы просто делать простые запросы SQL на основе формы ввода, но это один немного сложнее, так как это не так просто, как данные LIKE «% запросов%», а некоторые результаты более ценный для некоторых поисковых запросов, а некоторые нет.

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

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

Однако ничего не кэшируемое? :(

+0

Как хранятся в таблицах параметры A и B? – Khez

+0

В таблице с 1 или 0 на основе опции. Но это в конечном итоге будет смешано с другими критериями поиска ... –

+0

Добавлен ответ, не забудьте проверить его и прокомментировать с вопросами. – Khez

ответ

2

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

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

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

+0

Похож на полнотекстовый поиск, который не является тем, что я ищу ... –

+0

@julian, я просто подумал, что вы можете что-то сделать из процесса взвешивания, который они используют, поскольку это по сути то, что вы хотите сделать. вес ваши результаты, так что наиболее актуальным выходит на первое место – bumperbox

1

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

1

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

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

  • имени
  • dob_year
  • dob_month
  • dob_day

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

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

Хороший ИНЕКЕ и индекс должен будет держать вас от делать сканирование таблицы, но ...

Можно даже добавить вес к колонке, например,

SELECT ((dob_year = 1980)*2) 

Удачи.

0

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

Первые таблицы:

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, но те, с обоими вариантами, казалось бы, занимает «выше

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

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

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 

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

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

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

Смежные вопросы