Domanda

Ciao: Voglio fare una "ricerca ponderato" su prodotti che sono contrassegnati con le parole chiave. (Così: ricerca non full-text, ma n-to-m-relazione). Così qui è:

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   /

Quello che voglio è quello di ottenere un punteggio per tutti i prodotti che almeno "contiene" la parola chiave in questione. Se cerco ( 'cane', 'Elephant', 'Maus') Voglio che

Cane Crediti un punteggio di 1.003, Elephant di 1.002 Maus di 1.001

Quindi, meno importante termine di ricerca parte da 1.001, tutto il resto 0,001 ++. In questo modo, un limite punteggio inferiore di 3,0 sarebbe pari "E" query (tutte e tre le parole chiave devono essere trovati), un limite punteggio inferiore di 1,0 sarebbe pari a un "OR". Niente in mezzo qualcosa di più o di meno di corrispondenza. In particolare di classificare in base a questo punteggio, la maggior parte dei risultati di ricerca pertinenti sarebbero prima (indipendentemente dal limite inferiore) ...

Credo che dovrò fare qualcosa con

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

forse all'interno di un SUM () e probabilmente con un GROUP BY alla fine di un join sopra il tavolo croce, eh? Ma io sono abbastanza all'oscuro come affrontare questo.

Che cosa sarebbe fattibile, è quello di ottenere l'id della parola chiave dalle chiavi in ??anticipo. Questa è una domanda a buon mercato. Quindi la tavola parole chiave può essere lasciato ignorato ed è tutto circa l'altro della tavola a croce e di prodotto ...

Ho PHP a portata di mano per preparare automaticamente una dichiarazione PHP abbastanza lungo, ma vorrei evitare ulteriori più istruzioni SQL. In particolare, dal momento che limiterò il risultato di query (il più delle volte a "LIMIT 0, 20") per paging risultati modalità, in modo da loop di un numero molto elevato di tra risultati attraverso uno script sarebbe nulla di buono ...

dankeschön, se mi può aiutare su questo: -)

È stato utile?

Soluzione

Penso che un sacco di questo è nel motore Lucene (http://lucene.apache.org/java/docs/index.html), che è disponibile per PHP Zend Framework: http://framework.zend.com/manual/en/zend.search.lucene.html .

EDIT:

Se si vuole fare la cosa ponderato si sta parlando, penso che si potrebbe usare qualcosa di simile a questo:

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

(Modifica 2: ha dimenticato la clausola group by.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top