Pregunta

Hola: Quiero hacer una "búsqueda ponderada" en productos que están etiquetados con las palabras clave. (Por lo tanto: la búsqueda de texto completo no, pero n-de-m-relación). Así que aquí está:

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   /

Lo que quiero es conseguir una puntuación de todos los productos que por lo menos "contener" una palabra clave correspondiente. Si busco ( 'perro', 'elefante', 'Maus') Quiero que

Perro atribuye una puntuación de 1.003, Elefante de 1.002 Maus de 1.001

Así que menos importa término de búsqueda se inicia en 1.001, todo lo demás 0,001 ++. De esta manera, una puntuación límite inferior de 3,0 sería igual a "Y" consulta (las tres palabras clave deben ser encontrados), un límite menor puntuación de 1,0 sería igual a una "O". Nada en el medio algo más o menos coincidente. En particular, por clasificación de acuerdo con esta puntuación, la mayoría de los resultados relevantes serían primero (independientemente del límite inferior) ...

Me supongo que tendrá que hacer algo con

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

quizá dentro de un SUM () y, probablemente, con un GROUP BY en el extremo de la combinación sobre la mesa de cruz, ¿eh? Pero estoy bastante desorientado cómo hacer frente a esto.

¿Cuál sería factible, es conseguir la identificación de palabras clave de las palabras clave de antemano. Eso es una consulta barato. Por lo que la tabla de palabras clave se puede dejar pasar por alto y es todo acerca de la otra de la tabla de cruce y el producto ...

Tengo PHP a mano para preparar automáticamente una declaración de PHP bastante largo, pero me gustaría evitar más sentencias SQL múltiples. En particular, ya que voy a limitar el resultado de consulta (con mayor frecuencia en "LIMIT 0, 20") para paginación resultados modo, por lo que colocando un número muy grande de resultados en el medio a través de una secuencia de comandos sería nada bueno ...

Dankeschön, si usted me puede ayudar en esto: -)

¿Fue útil?

Solución

Creo que mucho de esto se encuentra en el motor Lucene (http://lucene.apache.org/java/docs/index.html), que está disponible para PHP de Zend Framework: http://framework.zend.com/manual/en/zend.search.lucene.html .

EDIT:

Si desea hacer lo ponderada que está hablando, supongo que se podría usar algo como esto:

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: olvidó la cláusula group by.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top