2011-12-26 13 views
6

Dobrze, więc próbuję wykonać wyszukiwanie pełnotekstowe na moim stole mysql. Oto zapytaniephp mysql mecz bez wyników

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 

i tu jest mój stół

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; 

mam kilka wierszy, które zawierają zarówno mile widziany w tytule lub w żart, ale nie wydaje się, aby każdy wyniki. Nie ma znaczenia, jakie słowo szukam.

Próbowałem zostały również usuwania i flags < 5 a także ups DESC, downs ASC LIMIT 0,30

Oba wydają się nie działać.

To co mam zrobić z kodu 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; 
    } 
} 

a to fetchAll (który pracował dla każdego innego zapytania Mam rzucił na nią).

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; 
    } 

Ktoś ma jakieś pomysły, co robię źle tutaj?

Dzięki.

+1

Usunięcie klauzul porządku (prawie nigdy) nie wpłynie na brak/obecność wyników. Ile danych masz w bazie danych? pamiętaj, że fulltext rozpatrzy każde słowo (słowa), które pojawią się w 50% + pól jako szum i zignoruje je. –

+0

Co stanie się, gdy po prostu uruchomisz kwerendę bezpośrednio na swoim DB (bez kodu zapytania)? – babonk

+0

Po uruchomieniu SQL bezpośrednio do mojej bazy danych (przez SQL w mysqladmin) nie otrzymuję wyników. Mam tylko 7 wpisów w bazie danych. –

Odpowiedz

2

Ponieważ 'welcome' jest stopword, tak że MySQL przeskakuje do wyszukiwania tego słowa.

Zobacz listę stopword MySQL Pełna szukać tekstu

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

I proszę przypomnieć długość słowa frazy wyszukiwania również, jeśli jego długość mniejszą niż 4, domyślnie MySQL pomija poszukiwaniu to też.

Na przykład "The Way I Am", "USA", "php", "praca" etc (czytaj więcej o ft_min_word_len)

+0

Zatem, aby wyjaśnić, "witamy" jest hasłem, co oznacza, że ​​wyszukiwanie pełnotekstowe je zignoruje. –

+0

Zadałem ci pytanie, dlaczego nie masz odpowiedzi? –

+0

@ kelton52 gdzie jest twoje pytanie? – hungneox

3

Nie jestem pewien, czy to zrobi wielkiej różnicy, ale czy próbowałeś używać trybu Boolean? W ten sposób:

AGAINST ('welcome' IN BOOLEAN MODE) 
+0

Mam, ale nie wydaje się, aby zrobić to, co chciałem. MySql po prostu nie wydaje się być w porządku dla pracy w wyszukiwarkach –

Powiązane problemy