2013-06-10 2 views
5

Я просто делаю кучу тестирования с помощью mysql's full text boolean mode, и из моего тестирования, похоже, вы не можете использовать знак минус на нескольких словах?Использование знака минус в нескольких словах в полном текстовом булевом режиме

У меня есть две строки, например ..

id,name 
1,2011-12 Fleer Retro auto jordan non 
2,1999 jordan non auto 

Если я запускаю следующий запрос:

SELECT auction_id,`name`,description FROM auctions WHERE MATCH(`name`) AGAINST('+jordan +auto -non' IN BOOLEAN MODE); 

Обе строки не показывают, как ожидалось. Однако, если я запустил этот запрос:

SELECT auction_id,`name`,description FROM auctions WHERE MATCH(`name`) AGAINST('+jordan +auto -"non auto"' IN BOOLEAN MODE); 

Обе строки не показывают (те же результаты). Не следует ли вызывать 1?

Edit: Мой ft_min_word_len установлен в 2 и я отключил мой стоп файл слова, так что это не имеет ничего общего с этим.

Fiddle: http://sqlfiddle.com/#!2/d1987/4

Однако, кажется скрипка использует стоп-слова по умолчанию файлу и, следовательно, тестирование его с «не» словом не работает.

+0

Попробуйте добавить еще несколько строк в таблицу. – Strawberry

+0

@ Струберри сожалеет, таблица имеет более двух строк ... на самом деле на самом деле имеет '164' строк. – Brett

+0

И примерно какой процент соответствует критериям, которые вы предоставляете? – Strawberry

ответ

0

Причина, по которой строка 1 не возвращается, заключается в том, что отрицательное действие (например, исключение) обгоняет положительное действие (например, включить). Это обычная практика в области безопасности, например, где DENIED разрешение имеет приоритет над ALLOW или GRANT разрешение действия.

С MySQL 12.9.2. Boolean Full-Text Searches:

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

Следовательно, любой запрос типа:

... AGAINST('+Any_string -"any_string"' IN BOOLEAN MODE) 

не даст ничего.

UPDATE

-"non auto" блоков «авто» появляться в результатах поиска, потому что non является стоп-словами и исключается из строки поиска. Еще одна причина для этого слова должны быть исключены из поиска в BOOLEAN MODE является то, что она слишком коротка:

Если фраза не содержит слов, которые находятся в индексе, то результат пуст. Например, если все слова являются либо временными, либо короче минимальной длины индексированных слов, результат пуст.

UPDATE 2

Я бы придерживаться моих объяснений выше. Хотя это не то, что ожидало бы юо.Это выглядит как двойные кавычки со знаком минус, так как в -"term1 term2" интерпретируются как () - круглые скобки, а не сомнительные qoutes.

Этот запрос ничего не возвращает, хотя я ожидаю увидеть строки, такие как 2011-12 Fleer Retro auto jordan non и 1999 jordan non auto. Это не имеет никакого отношения к стоп-словам.

SELECT auction_id,`name` FROM auctions 
WHERE MATCH(`name`) AGAINST('+jordan +auto -"jordan auto"' IN BOOLEAN MODE); 

Также есть связанная ошибка # 36384: Full-Text required (+) operator bug. Он поддерживает мою гипотезу о том, что разбор полнотекстовых поисковых выражений может работать не так, как ожидалось.

+0

Но я не блокировал 'auto'; Я включил термин в двойные кавычки, поэтому он должен только блокировать полный термин 'non auto'. – Brett

+0

@Brett 'non' является либо слишком коротким, либо временным, либо тем и другим. – Stoleg

+0

My 'ft_min_word_len' установлен в' 2', и я отключил файл стоп-слова, чтобы он не влиял на результаты. – Brett

0

Ненавижу говорить об этом, но вам нужно будет использовать LIKE. Ниже я включил запрос, который будет работать так, как вы хотите его

SELECT auction_id,`name` FROM auctions WHERE MATCH(`name`) AGAINST('+jordan' IN BOOLEAN 
MODE) AND `name` NOT LIKE('%non auto%') ; 

Проблема с использованием режима полного текста является то, что в соответствии с docs в MySQL:

поиска Фраза только требует, чтобы матчи содержат точно те же слова, что и фраза и в том же порядке. Например, «тестовая фраза» соответствует «тесту, фразе» в MySQL 5.0.3, но не раньше.

Вот почему у вас проблемы. Надеюсь это поможет. EDIT: Что касается того, почему он ведет себя именно так (исключая вещи, которые содержат авто и не независимо от того, где они относятся друг к другу), я не знаю, но это не похоже на то, что есть много способов переопределить это значение по умолчанию поведение.

+0

Хмммм ...... не очень важно для меня, что я пойду на использование 'LIKE' и будет больно делать динамически. – Brett

+0

Это не было бы болью. Вы просто получаете любую строку от пользователя или в другом месте кода и окружаете его%% в подобном состоянии, и вы настроены. Но я не знаю, как вы получаете вход для поиска, так что, возможно, это не сработает. –