2011-12-26 20 views
6

大丈夫ですので、私のmysqlテーブルで全文検索をしようとしています。ここでは、クエリPHP mysqlと結果が一致しません

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 

、ここでは私のテーブルが

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; 

です私はどちらかが含まれているカップルの行を持っているタイトルで歓迎し、または冗談で、私はいずれかを取得していないようです結果。私が検索する単語は問題ではありません。

私はまた、両方が動作していないよう取り外しとflags < 5ともups DESC, downs ASC LIMIT 0,30

しようとしました。

これは私が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; 
    } 
} 

で何をすべきかであり、これは(私はそれで投げてきた他のすべてのクエリのために働いている)fetchAllのです。

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

誰でも私がここで間違っていることは何ですか?

ありがとうございました。

+1

結果句の削除は、結果の欠落/不在に影響を与えます(ほとんど決してありません)。あなたはデータベースにどれくらいのデータを持っていますか?フルテキストは、フィールドの50%以上に現れる単語をノイズとみなし、無視することを覚えておいてください。 –

+0

DB上で直接クエリを実行すると(コードを照会していない)どうなりますか? – babonk

+0

私は自分のデータベースにSQLを直接(mysqladminのSQL経由で)実行しても、結果は得られません。私はデータベースに7つのエントリしかないと言っています。 –

答えて

2

「welcome」です。STOPWORDですので、MySQLはスキップしてこの単語を検索します。

ここ

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

をMySQLの全文検索のストップワードリストを参照し、4よりもその長さ小さい場合は、検索のためにスキップされるデフォルトのMySQLでも、検索語句内の単語の長さを思い出させてくださいそれも。例えば

「私は道」、「USA」、「PHP」、「仕事」など(ft_min_word_lenについての詳細を読む)

+0

したがって、「歓迎」はストップワードです。フルテキスト検索では無視されます。 –

+0

私はあなたに質問しました。なぜあなたは答えられませんでしたか? –

+0

@ kelton52どこがあなたの質問ですか? – hungneox

3

私はそれが大きな違いを行います場合は、あまりにもわからないんだけど、ブールモードを使ってみましたか?このように:

+0

私は持っていましたが、私が望むことをしていないようでした。 MySqlは検索エンジンの仕事のためだけには見えない –

関連する問題