2011-12-26 8 views
6

Muy bien, así que estoy tratando de hacer una búsqueda de texto completo en mi tabla mysql. Ésta es la consultaphp mysql partido en contra de ningún resultado

SELECT *, 
     MATCH (title, joke) AGAINST ('welcome') AS relevance, 
     MATCH (title) AGAINST ('welcome') AS title_relevance 
FROM jokes 
WHERE MATCH (title, joke) AGAINST ('welcome') 
AND flags < 5 
ORDER BY title_relevance + relevance + ups DESC, downs ASC LIMIT 0, 30 

y aquí está mi mesa

CREATE TABLE IF NOT EXISTS `jokes` (
    `jid` varchar(24) NOT NULL, 
    `uid` int(11) NOT NULL, 
    `title` mediumtext NOT NULL, 
    `joke` longtext NOT NULL, 
    `ups` int(11) NOT NULL DEFAULT '0', 
    `downs` int(11) NOT NULL DEFAULT '0', 
    `flags` int(11) NOT NULL DEFAULT '0', 
    `createddate` int(11) NOT NULL, 
    `editdate` int(11) NOT NULL, 
    PRIMARY KEY (`jid`), 
    FULLTEXT KEY `searcher` (`title`,`joke`), 
    FULLTEXT KEY `title` (`title`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

Tengo un par de filas que contienen cualquiera de bienvenida en el título o en la broma, pero no parecen tener ningún resultados. No importa qué palabra busque.

También he intentado quitar y flags < 5 y también no parecen funcionar ups DESC, downs ASC LIMIT 0,30

Ambos.

Esto es lo que hago con el código php

if($st->prepare($SearchQuery)) 
{ 
    if(!$st->execute()) 
     ChromePhp::log("Execute Error: " . $st->error); 
    else 
    { 
     $results = fetchAll($st); 
     $ret = new stdClass(); 
     $ret->TotalCount = 0; 
     $ret->Results = $results; 
     return $ret; 
    } 
} 

y esto es fetchAll (que ha trabajado para todos los demás que he consulta arrojó en ella).

function fetchAll($result) 
    {  
     $array = array(); 

     if($result instanceof mysqli_stmt) 
     { 
      $result->store_result(); 

      $variables = array(); 
      $data = array(); 
      $meta = $result->result_metadata(); 

      while($field = $meta->fetch_field()) 
       $variables[] = &$data[$field->name]; // pass by reference 

      call_user_func_array(array($result, 'bind_result'), $variables); 

      $i=0; 
      while($result->fetch()) 
      { 
       $array[$i] = array(); 
       foreach($data as $k=>$v) 
        $array[$i][$k] = $v; 
       $i++; 

       // don't know why, but when I tried $array[] = $data, I got the same one result in all rows 
      } 
     } 
     elseif($result instanceof mysqli_result) 
     { 
      while($row = $result->fetch_assoc()) 
       $array[] = $row; 
     } 

     return $array; 
    } 

¿Alguien tiene alguna idea de lo que estoy haciendo mal aquí?

Gracias.

+1

La eliminación de cláusulas de orden es (casi nunca) va a afectar la falta/presencia de resultados. ¿Cuántos datos tienes en la base de datos? recuerde que el texto completo considerará cualquier palabra (s) que aparezca en el 50% + de los campos como ruido e ignórelos. –

+0

¿Qué sucede cuando solo ejecuta la consulta directamente en su base de datos (si no está consultando el código)? – babonk

+0

Cuando ejecuto el SQL directamente a mi base de datos (a través de SQL en mysqladmin) no obtengo ningún resultado. Solo tengo que decir 7 entradas en la base de datos. –

Respuesta

2

Debido 'bienvenida' es una palabra vacía , por lo que MySQL se salta a buscar esta palabra.

Ver la lista de palabras de parada de búsqueda de texto MySQL completa aquí

http://dev.mysql.com/doc/refman/5.5/en/fulltext-stopwords.html

Y por favor recuerda la longitud de las palabras en la frase de búsqueda también, si su longitud de menos de 4, por defecto MySQL salta para la búsqueda Eso también.

Por ejemplo "la manera que soy", "EE.UU.", "php", "trabajo", etc (leer más sobre ft_min_word_len)

+0

Por lo tanto, para aclarar, 'bienvenida' es una palabra de advertencia, lo que significa que una búsqueda de texto completo lo ignorará –

+0

Le hice una pregunta, ¿por qué no responde? –

+0

@ kelton52 ¿dónde está su pregunta? – hungneox

3

No estoy muy seguro si va a hacer mucha diferencia, pero has intentado usar el modo booleano? De esta manera:

AGAINST ('welcome' IN BOOLEAN MODE) 
+0

Lo he hecho pero no parecía hacer lo que yo quería. MySql simplemente no parece estar a la altura de los motores de búsqueda –

Cuestiones relacionadas