Pero, ¿cómo podría coincidir con TST-DFS si el usuario escribe en TST DFS?
me gustaría que SKU para tener una relevancia de 8 dicen que, en lugar de la totalidad de 10 ..
Si tengo la pregunta correcta, la respuesta es fácil.
Bueno, si forje su consulta un poco antes de enviarla a mysql.
Ok, digamos que tenemos $query
y contiene TST-DFS
.
¿Nos vamos a centrar en tramos de palabra? supongo que debería, como la mayoría de los motores de búsqueda hacen, por lo que:
$ok=preg_match_all('#\w+#',$query,$m);
ahora si ese patrón coincide ... $m[0]
contiene la lista de palabras en $query
.
Esto se puede ajustar con precisión a su SKU, pero la coincidencia con palabras completas de forma AND es prácticamente lo que el usuario supone que está sucediendo. (como ocurre en google y yahoo)
Luego tenemos que cocinar una expresión $expr
que se inyectará en nuestra consulta final.
if(!$ok) { // the search string is non-alphanumeric
$expr="false";
} else { // the search contains words that are no in $m[0]
$expr='';
foreach($m[0] as $word) {
if($expr)
$expr.=" AND "; // put an AND inbetween "LIKE" subexpressions
$s_word=addslashes($word); // I put a s_ to remind me the variable
// is safe to include in a SQL statement, that's me
$expr.="word LIKE '%$s_word%'";
}
}
Ahora $expr
debe ser similar "words LIKE '%TST%' AND words LIKE '%DFS%'"
Con ese valor, podemos construir la consulta final:
$s_expr="($expr)";
$s_query=addslashes($query);
$s_fullquery=
"SELECT (Product,word,if((word LIKE '$s_query'),relevancy,relevancy-2) as relevancy) ".
"FROM some_index ".
"WHERE word LIKE '$s_query' OR $s_expr";
que queda modificada, para "TST-DFS":
SELECT (Product,word,if((word LIKE 'TST-DFS'),relevancy,relevancy-2) as relevancy)
FROM some_index
WHERE word LIKE 'TST-DFS' OR (word LIKE '%TST%' AND word LIKE '%DFS%')
Como puede ver, en la primera línea SELECT
, si la coincidencia es parcial, MySQL volverá relevancia-2
En la tercera, la cláusula WHERE
, si el partido completo falla, $s_expr
, la consulta coincidencia parcial cocinamos con antelación, se pretende en lugar.
¿No puedes usar 'capacidades FULLTEXT' de MySQL, o es que lo que quiere decir cuando se dice "índice"? – Bojangles
El problema es que tengo mucha información que es importante, pero FULLTEXT de MySQL no sabe que es importante (como números de sku, nombre de producto y otras palabras determinadas). Así que estoy indexando cada palabra en cada producto, y no creo que FULLTEXT de MySQL me ayude a buscar en cada una de las filas. – Ben
Oh, claro. Por lo que puedo ver, no, 'FULLTEXT' no sería útil en absoluto. Una pena realmente, ya que es una parte maravillosa de MySQL. – Bojangles