php mysql совпадение с нет результатов - PullRequest
6 голосов
/ 27 декабря 2011

Хорошо, поэтому я пытаюсь выполнить полнотекстовый поиск по моей таблице 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;

У меня есть пара строк, которые содержат либо приветствие в заголовке, либо в анекдоте, но я неКажется, получить какие-либо результаты.Неважно, какое слово я ищу.

Я также пытался удалить AND 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;
    }

Любойесть идеи, что я тут делаю не так?

спасибо.

Ответы [ 2 ]

3 голосов
/ 29 декабря 2011

Я не слишком уверен, если это будет иметь большое значение, но вы пробовали использовать булевский режим?Как это:

AGAINST ('welcome' IN BOOLEAN MODE)
2 голосов
/ 28 декабря 2011

Поскольку 'welcome' является STOPWORD , так что MySQL пропускает поиск этого слова.

См. Список стоп-слов MySQL Полнотекстовый поиск здесь

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

И, пожалуйста, напомните также длину слов в поисковой фразе, если ее длина меньше 4, по умолчанию MySQL пропустит ее поиск.

Например, «таким, какой я есть», «сша», «php», «работа» и т. Д. (Подробнее о ft_min_word_len)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...