2011-05-04 6 views
1

Dans mon application (PHP/MySQL/JS), j'ai une fonctionnalité de recherche intégrée. Un des critères de recherche contient des cases à cocher pour différentes options, et certains résultats seraient plus pertinents que d'autres, s'ils contiennent plus ou moins de chaque option.Concevoir une recherche "basée sur la pertinence"?

à savoir Les options sont A et B, et si je recherche pour les options A et B, Résultat 1 qui ne contient que l'option A est 50% relevent, tandis que Résultat 2 contenant à la fois les options A et B est 100% utile.

Avant, je serais tout simplement faire des requêtes SQL simples basés sur les entrées de formulaire, mais celui-ci est un peu plus difficile, car il est pas aussi simple que les données LIKE « %% des requêtes », mais plutôt, certains résultats sont plus précieux pour certaines requêtes de recherche, et certains ne le sont pas.

Je n'ai absolument aucune idée par où commencer ... est-ce que quelqu'un a du matériel de lecture pertinent (ha!) Pour me diriger vers?

Modifier: Après avoir réfléchi au-dessus, je pense quelque chose qui implique un script SQL pour obtenir les données brutes, suivi par de nombreux de nombreux tours de l'analyse syntaxique est quelque chose que je dois faire ...

Rien de cacheable, cependant? :(

+0

Comment les options A et B sont-elles stockées dans vos tables? – Khez

+0

Dans un tableau avec 1 ou 0 selon l'option. Mais cela finirait par être mélangé dans d'autres critères de recherche ... –

+0

Ajout d'une réponse, assurez-vous de vérifier et de commenter avec des questions. – Khez

Répondre

2

un regard sur le projet lucence il est disponible dans de nombreuses langues

c'est le port php http://framework.zend.com/manual/en/zend.search.lucene.html

il indexe les articles à la recherche et renvoie les résultats de recherche pondérés pertinents, par exemple mieux alors sélectionnez x de y où nommez le style '% pattern%' recherche

+0

On dirait que la recherche de texte intégral, ce n'est pas ce que je cherche ... –

+0

@julian, je pensais juste que vous pourriez être capable de donner quelque chose du processus de pondération qu'ils utilisent, car c'est essentiellement ce que vous voulez faire. pondérer vos résultats afin que le plus pertinent vient en haut – bumperbox

1

Vous avez besoin d'un puissant moteur de recherche, comme solr. autres outils

1

Voici une idée: faites les comparaisons et additionnez les résultats. Plus la somme est élevée, plus les critères correspondent.

Que diriez-vous un (stupide) table comme ceci:

  • Nom
  • dob_year
  • dob_month
  • dob_day

Trouvez la personne qui partage le plus des trois jour composants avec 3/15/1980:

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

Une bonne clause WHERE et l'index seraient nécessaires pour vous empêcher de faire un scan de table, mais ...

Vous pouvez même ajouter un poids à une colonne, par exemple

SELECT ((dob_year = 1980)*2) 

Bonne chance.

0

Compte tenu de votre réponse à mon commentaire, voici un exemple sur la façon dont vous pouvez le faire:

D'abord les tables:

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

Ensuite, un exemple de certains éléments et critères:

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

Cela créerait 3 éléments et 3 options et leur attribuerait des options.

Maintenant il y a de façon multiple, vous pouvez commander par une certaine « force ». Le plus simple qui serait:

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 

Cela vous montrer tous les éléments qui ont l'option 1 ou 3, mais ceux

avec les deux options semble être classé « plus haut Cela fonctionne bien si vous. Faites une recherche sur 2 options, mais supposons que vous fassiez une recherche sur les 3 options.Tous les éléments partagent maintenant la même force, c'est pourquoi il est important d'assigner des "poids" aux options

Vous pourriez faire la valeur de votre force, mais cela pourrait ne pas vous aider si vos requêtes n'attribuent pas toujours les mêmes poids aux mêmes options partout. y atteint par requête avec la requête suivante:

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 

Essayez les requêtes et voyez si c'est ce dont vous avez besoin.

Je voudrais aussi noter que ce n'est pas la meilleure solution en termes de puissance de traitement. Je vous recommande d'ajouter des index, de rendre le champ d'option un entier, de mettre en cache les résultats autant que possible.

Laissez un commentaire si vous avez des questions ou n'importe quoi ajouter.

Questions connexes