2010-10-16 7 views
0

Comment implémenteriez-vous un moteur de recherche personnalisé?Moteur de recherche personnalisé

Que pensez-vous quelque chose comme ceci:

SELECT * 
FROM jobs 
WHERE job_id IN (
     SELECT job_id 
      FROM job_words 
     WHERE word_id IN (SELECT word_id FROM words w WHERE text = 'carpenter')) 
    AND job_id IN (
     SELECT job_id 
      FROM job_words 
     WHERE word_id IN (SELECT word_id FROM words w WHERE text = 'buildings')) 

ou ceci:

SELECT j.* 
     ,s.matches 
    FROM jobs as j INNER JOIN 
     (SELECT jw.job_id, count(*) as matches 
      FROM job_words AS jw 
       INNER JOIN (SELECT word_id FROM words w WHERE text IN ('carpenter', 'buildings')) AS w ON w.word_id = jw.word_id 
     GROUP BY jw.job_id) as s ON s.job_id = j.job_id 
+0

Pour quelle base de données? –

+0

Peu importe. Je pense à créer ma propre façon de chercher au lieu d'utiliser des fonctions intégrées à la base de données. – Eduardo

+1

En fait, c'est le cas - "SQL" signifie "Structured Query Language", pas "Standardisé". À ma connaissance, la recherche en texte intégral (FTS) n'est pas ANSI - vous devez utiliser un outil FTS tiers comme Sphinx pour que les choses soient portables entre les bases de données. Les fonctions de chaînes ne sont pas standardisées entre les bases de données, donc bonne chance! –

Répondre

0

Vous feriez mieux de construire les tables de vos mots-clés à l'avance. Votre code est très inefficace. Vous exécutez en principe O (n (n + n)) chaque fois que vous exécutez ce code. Au lieu de faire les tables pour tous les «charpentier» et «bâtiments» avant la main et si la table pour la requête de recherche n'existe pas, alors utilisez le code que vous avez posté.

+0

«menuisier» et «bâtiments» sont des mots dans la description d'emploi. Cette instruction SQL recherche les travaux contenant les deux mots. – Eduardo

+0

Droite. Je pense que la meilleure performance que vous obtiendrez serait de faire les tableaux pour tous vos mots clés dans une description de travail. Fondamentalement pour hacher tous les mots-clés tels qu'ils sont affichés. Cela peut être exagéré pour votre projet, et il n'est vraiment nécessaire que si vos offres d'emploi sont publiées beaucoup moins fréquemment par rapport au nombre de recherches que vous exécutez. – amccormack

0
SELECT * FROM jobs WHERE 
    job_id in (SELECT job_id FROM job_words WHERE 
     word_id in (SELECT word_id FROM words WHERE text in ('carpenter', 'buildings')) 
+0

De cette façon, nous allons chercher des emplois qui contiennent «charpentier» ou «bâtiments». – Eduardo