2010-08-09 9 views
15

Jestem trochę zagubiony, to wygląda jak jakiś głupi błąd - ale nie mam pojęcia, co to może być. Oto sesja testowa:Wyszukiwanie FULLTEXT w MySQL nie zwraca żadnych wierszy

mysql> drop table articles; 
Query OK, 0 rows affected (0.02 sec) 

mysql> CREATE TABLE articles (body TEXT, title VARCHAR(250), id INT NOT NULL auto_increment, PRIMARY KEY(id)) ENGINE = MYISAM; 
Query OK, 0 rows affected (0.02 sec) 

mysql> ALTER TABLE articles ADD FULLTEXT(body, title); 
Query OK, 0 rows affected (0.02 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> insert into articles(body) values ('Maya'); 
Query OK, 1 row affected (0.00 sec) 

mysql> SELECT * FROM articles WHERE MATCH(title, body) AGAINST('Maya'); 
Empty set (0.00 sec) 

mysql> select * from articles 
    -> ; 
+------+-------+----+ 
| body | title | id | 
+------+-------+----+ 
| Maya | NULL | 1 | 
+------+-------+----+ 
1 row in set (0.00 sec) 

Jest on "mysqld Ver 5.1.37-1ubuntu5 dla debian-linux-gnu na i486 ((Ubuntu))".

Oto prosty skrypt do wycinania i wklejania (proszę spróbować i sprawdzić, czy to działa w systemie):

CREATE TABLE articles (body TEXT, title VARCHAR(250), id INT NOT NULL auto_increment, PRIMARY KEY(id)) ENGINE = MYISAM; 
ALTER TABLE articles ADD FULLTEXT(body, title); 
insert into articles(body) values ('Maya'); 
SELECT * FROM articles WHERE MATCH(title, body) AGAINST('Maya');  
+2

+1 do zadawania grzywny, zrozumiałe, dobrze udokumentowany pytanie na pierwszej podróży. –

Odpowiedz

19

W MySQL Istnieją trzy rodzaje wyszukiwań pełnotekstowych:

  • logiczna wyszukiwania
  • język naturalny wyszukiwania (używany domyślnie)
  • wyszukiwania ekspansja zapytania

Od MySQL manual entry:

Naturalny wyszukiwania język interpretuje ciąg wyszukiwania jako wyrażenie w języku naturalnym ludzkim (wyrażenie w swobodnego tekstu). Nie ma specjalnych operatorów . Obowiązuje lista stopword. Ponadto, słów, które są obecne w 50% lub więcej wierszy są uważane za wspólne i nie pasują. Wyszukiwanie pełnotekstowe jest naturalne wyszukiwane języki, jeśli podano IN NATURAL modyfikator JĘZYK lub jeśli nie podano modyfikatora .

Na przykład, spróbuj dodać kolejne dwa rekordy:

INSERT INTO articles(body) VALUES ('Some text'), ('Another text'); 

i wykonujących te same SELECT ponownie - to będzie działać.

Jako obejście, można użyć trybu logiczną, która nie ma tej „50%” regułę:

SELECT * FROM articles WHERE MATCH(title, body) AGAINST('Maya' IN BOOLEAN MODE); 
Powiązane problemy