2013-02-08 9 views
7

Pracuję na stronie internetowej, gdzie są dwie tabele, prawie identyczne, gdzie MECZ PRZECIWKO działa na jedną, ale nie na drugą. Aby dowiedzieć się, dlaczego starałem się ograniczyć to do prostego, "Zróbmy prostą tabelę" - ale tak nie jest.MECZ MySQL NIE DZIAŁA

Robię testowanie z phpMyAdminem i to jest MySQL 5.1.41.

Test buduję stosuje się następującą zdefiniować tabelę ...

CREATE TABLE IF NOT EXISTS `test` (
    `id` int(11) NOT NULL, 
    `title` text NOT NULL, 
    `body` text NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

ALTER TABLE `test` ADD FULLTEXT (`title`, `body`); 

i kiedy robić show indeks z testu widzę, że tam jest kluczowym FULLTEXT zawierający tytuł i ciało.

wstawić kilka wierszy z

INSERT INTO `test` (`id`, `title`, `body`) VALUES 
('1', 'Lorem Ipsum', 'Lorem ipsum dolor sit amet, consectetur ... lacus porta euismod.'), 
('2', 'Lorem Ipsum (cont)', 'Nunc leo massa, vulputate ... euismod fringilla.'); 

(niektóre zawartości ciała usunięte dla zwięzłość)

a kiedy biegnę

SELECT * FROM `test` WHERE MATCH (`title`, `body`) AGAINST ('consectetur'); 

dostaję pusty zestaw wyników - nie wiersze znalezione, ale jeśli działa

SELECT * FROM `test` WHERE `body` LIKE '%consectetur%'; 

, a następnie znaleziono rekord.

Chociaż mam duże doświadczenie z MySQL, po raz pierwszy użyłem MATCH, więc czy robię coś głupiego? Dlaczego to nie działa? Czy indeks musi zostać zbudowany (zrobiłem NAPRAWĘ na stole), czy to wszystko ma się wydarzyć automatycznie?

Tylko dla informacji, tabela, która działa jest określona z

CREATE TABLE IF NOT EXISTS `web_pages1` (
    `id` int(11) NOT NULL, 
    `title` varchar(255) DEFAULT NULL, 
    `slug` varchar(255) DEFAULT NULL, 
    `meta_keywords` text, 
    `meta_description` text, 
    `snippet` text, 
    `body` mediumtext, 
    `created_by` int(11) DEFAULT NULL, 
    `date_created` datetime DEFAULT NULL, 
    `date_published` date DEFAULT NULL, 
    `author` varchar(255) DEFAULT NULL, 
    `edited_by` int(11) DEFAULT NULL, 
    `date_edited` datetime DEFAULT NULL, 
    `status` tinyint(4) NOT NULL DEFAULT '1', 
    `parent_id` tinyint(11) DEFAULT NULL, 
    `menu_id` int(11) DEFAULT NULL, 
    `short_name` varchar(255) DEFAULT NULL, 
    `sort_order` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    FULLTEXT KEY `search` (`title`,`slug`,`meta_keywords`,`meta_description`,`snippet`,`body`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

i ten, który jest przyczyną mnie problemów i wysłał mnie na dół tej trasy jest

CREATE TABLE IF NOT EXISTS `web_news1` (
    `id` int(11) NOT NULL, 
    `title` varchar(255) NOT NULL, 
    `slug` varchar(255) NOT NULL, 
    `meta_keywords` text, 
    `meta_description` text, 
    `snippet` text NOT NULL, 
    `body` text NOT NULL, 
    `created_by` int(11) NOT NULL, 
    `date_created` datetime NOT NULL, 
    `date_published` date DEFAULT NULL, 
    `author` varchar(255) DEFAULT NULL, 
    `edited_by` int(11) DEFAULT NULL, 
    `date_edited` datetime DEFAULT NULL, 
    `status` tinyint(4) DEFAULT '0', 
    PRIMARY KEY (`id`), 
    FULLTEXT KEY `search` (`title`,`slug`,`meta_keywords`,`meta_description`,`snippet`,`body`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

Chociaż próbowałem definiowanie drugi dokładnie taki jak pierwszy i nadal nie działa.

Odpowiedz

4

Z manual:

Wynikiem wyszukiwania jest pusta, ponieważ słowo „cokolwiek” jest obecny w co najmniej 50% rzędów. Jako taki jest skutecznie traktowany jako stopword. W przypadku dużych zestawów danych jest to najbardziej pożądane zachowanie: zapytanie w języku naturalnym nie powinno zwracać co drugi wiersz z tabeli 1GB . W przypadku małych zestawów danych może być mniej pożądane.

Masz dwa wiersze w tabeli ...

+0

I tęskniłem za tym!Jednak stół, którego szukam, może mieć tylko niewielką liczbę rzędów (obecnie jest tylko 1, a strona jest na żywo), więc POTRZEBA zwrócić mecze, chociaż może to być (w tym przypadku) KAŻDY rząd w tabeli! – Ken