2014-01-22 3 views
2

я получил очень простую таблицу с 2 строками:Почему MYSQL FullText search Match AGAINST не работает должным образом?

create table T1(text varchar(50), FULLTEXT KEY `text` (`text`) 
       ) ENGINE=MyISAM DEFAULT CHARSET=latin1; 
insert into T1 (text) values ('local unit shipping fee 12'); 
insert into T1 (text) values ('local unit insernational fee 21'); 

Хорошо, теперь я не бегут:

1- Select * from T1 where MATCH(text) AGAINST ('local'); никакого результата

2- Select * from T1 where MATCH(text) AGAINST ('fee'); никакого результата

3- Select * from T1 where MATCH(text) AGAINST ('+fee' In Boolean mode); нет результатов

4- Select * from T1 where MATCH(text) AGAINST ('+shipping' In Boolean mode); 1 ряд выходит

5- Select * from T1 where MATCH(text) AGAINST ('+unit' In Boolean mode); 2 ряда выходят.

Вы можете увидеть здесь sqlfiddle http://sqlfiddle.com/#!2/9a0866/13

Пожалуйста, объясни мне это ясно, как MYSQL полнотекстовый поиск работы, почему он не показывает ничего для такой очень простой логики запроса?

Я смущен!

ответ

4

Ваши корпуса настолько малы, что в режиме естественного языка «местные» и «платные» слова рассматриваются как стоп-слова и игнорируются - они соответствуют повсюду.

Это происходит потому, что в качестве эвристики по умолчанию вы не хотите, чтобы запрос возвращал каждую строку или любую другую строку набора данных 100 ГБ.

порог Совпадения по умолчанию составляет 0,5, и устраняет его в конкретном примере, вам нужно будет добавить несколько строк:

create table T1(text varchar(50), FULLTEXT KEY `text` (`text`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

insert into T1 (text) values ('local unit shipping fee 12'); 
insert into T1 (text) values ('a row'); 
insert into T1 (text) values ('another row'); 
insert into T1 (text) values ('and another row'); 
insert into T1 (text) values ('local unit international fee 21'); 

select * from T1 where MATCH(text) AGAINST ('local'); 

Output: 
TEXT 
local unit shipping fee 12 
local unit international fee 21 

При добавлении нескольких строк без слова «местный» запрос будет забивать ниже порог, и вы увидите возвращаемые соответствующие строки. Также обратите внимание, что слово «гонорар» слишком мало для запроса на естественный язык. Длина должна быть не менее 4 символов.

В булевом полнотекстовом поиске нет порога.

+0

действительно, у моей настоящей БД есть 200 000 строк и «местная плата за доставку единицы 12» - это одна из этих строк? почему так мало? – Tum

+0

также не имеет никакого смысла, потому что QUERO должен работать в любом размере, независимо от того, насколько маленькая таблица должна показывать правильные результаты. – Tum

+0

я добавил еще 2 строки, но результата нет http://sqlfiddle.com/#! 2/181c3/1 – Tum

Смежные вопросы