Question

Bonjour: Je veux faire une « recherche pondérée » sur le produit qui sont étiquetés avec des mots clés. (Donc: pas de recherche textuelle, mais n à m-lien de parenté). Alors voici:

Table 'product':
sku  - the primary key
name

Table 'keywords':
kid   - keyword idea
keyword_de  - German language String   (e.g. 'Hund','Katze','Maus')
keyword_en  - English language String  (e.g. 'Dog','Cat','Mouse')

Table 'product_keyword' (the cross-table)
sku   \__ combined primary key
kid   /

Ce que je veux est d'obtenir un score pour tous les produits au moins « contiennent » un mot-clé pertinent. Si je recherche ( 'Dog', 'Elephant', 'Maus') Je veux que

Dog attribue un score de 1,003, Elephant de 1,002 Maus de 1,001

terme de recherche donc moins importante commence à 1,001, tout le reste 0,001 ++. De cette façon, une limite de score inférieur de 3,0 égalerait « ET » requête (tous les trois mots-clés doivent être trouvés), une limite de score inférieur de 1,0 égal à un « OU ». Tout ce qui entre quelque chose de plus ou moins correspondant. Notamment par le tri en fonction de ce score, la plupart des résultats de recherche pertinents seraient d'abord (quelle que soit la limite inférieure) ...

Je suppose que je vais devoir faire quelque chose avec

  IF( keyword1 == 'dog', 1.001, 0) + IF...

peut-être dans un SUM () et probablement avec GROUP BY à la fin d'une jointure sur la table croix, hein? Mais je suis assez désemparés comment aborder ce sujet.

Quelle serait possible, est d'obtenir l'identifiant mot-clé des mots-clés de l'avance. C'est une requête pas cher. Ainsi, le tableau des mots clés peut être laissé ignoré et il est tout au sujet de l'autre de la table croix et produit ...

J'ai PHP à portée de main pour préparer automatiquement une instruction PHP assez longue, mais je voudrais éviter d'autres plusieurs instructions SQL. En particulier depuis que je vais limiter les résultats de recherche (le plus souvent à « LIMIT 0, 20 ») pour les résultats en mode pagination, boucle donc un très grand nombre d'entre les résultats à travers un script ne serait pas bon ...

DANKESCHÖN, si vous pouvez me aider à ce sujet: -)

Était-ce utile?

La solution

Je pense que beaucoup de cela est dans le moteur Lucene (http://lucene.apache.org/java/docs/index.html), qui est disponible pour PHP dans le Zend Framework: http://framework.zend.com/manual/en/zend.search.lucene.html .

EDIT:

Si vous voulez faire la chose pondérée dont vous parlez, je suppose que vous pouvez utiliser quelque chose comme ceci:

select p.sku, sum(case k.keyword_en when 'Dog' then 1001 when 'Cat' then 1002 when 'Mouse' then 1003 else 0 end) as totalscore
from products p
left join product_keyword pk on p.sku = pk.sku
inner join keywords k on k.kid = pk.kid
where k.keyword_en in ('Dog', 'Cat', 'Mouse')
group by p.sku

(Edit 2: Mot de la clause group by.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top