Mysql полнотекстовый поиск не находит, если искомая строка не разделена пробелами - PullRequest
0 голосов
/ 02 февраля 2011

Я строю небольшой поиск с помощью PHP. Вот пример запроса:

SELECT * FROM tools
WHERE name LIKE "%example%"
ORDER BY name;

Пара имен:

this example will be found
this example1 will not be found

Он находит только строки, если искомая строка является отдельным словом. Любой совет? :)

Спасибо, Марти Лейн

Ответы [ 2 ]

0 голосов
/ 02 февраля 2011

Так и должно быть. MySQL Полнотекстовый поиск с использованием так называемого stemming для построения поискового индекса. Таким образом, потребуется слово типа shopping и store shop (так как это одно и то же слово). Таким образом, при поиске одного варианта слова могут быть найдены все варианты слова.

Однако в вашем случае это может быть не самой лучшей ситуацией. Ну, для этого у вас есть 2 возможности:

  1. Используйте LIKE с полнотекстовым поиском.

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

  2. Используйте инструмент поиска 3pd, такой как Sphinx или SOLR .

    Вероятно, это будет наиболее эффективный вариант, поскольку эти инструменты очень хороши в своем поиске и очень быстры на . По сути, инструменты время от времени индексируют базу данных MySQL (в зависимости от настроек), а затем вы выполняете поиск по инструменту вместо MySQL. Это самый надежный и самый гибкий вариант.

0 голосов
/ 02 февраля 2011

Я запустил следующий скрипт

CREATE TABLE tools ( 
  name TEXT, 
  FULLTEXT (name) 
) ENGINE=MyISAM;

INSERT tools VALUES('this example will be found');
INSERT tools VALUES('this example1 will not be found');

SELECT * FROM tools
WHERE name LIKE "%example%"
ORDER BY name;

Который дал выход

this example will be found 
this example1 will not be found

Я даже получил тот же вывод при запуске SELECT без индекса FULLTEXT.

Можете ли вы опубликовать DDL для создания вашей базы данных и любых ошибок, которые вы получите? Кроме того, правильно ли выполняется SQL в MySQL Workbench или вы пробовали его только из своего PHP-кода?

(я понимаю, что это не совсем ответ на ваш вопрос, но публикация в качестве ответа позволяет лучше форматировать текст)

РЕДАКТИРОВАТЬ: После просмотра комментария от Ajreal я также попытался

SELECT * FROM tools
WHERE MATCH(name) AGAINST ('example')

и на этот раз не вернуло ни одной строки ...

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