MySQL полнотекстовый поиск множественного числа / единственного числа слов

У меня есть такой стол

CREATE TABLE jobs(
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title VARCHAR(200),
    body TEXT,
    FULLTEXT (title,body)
) ENGINE=MyISAM;

И две записи в этой таблице

...
7. 10 Senior PHP Developers (Leaders) 
8. 30 PHP Developers..
...

И два запроса:

  1. Вернуть 2 записи выше

    SELECT * FROM jobs WHERE MATCH (title,body) AGAINST ('developers')

  2. Возврат пустого набора

    SELECT * FROM jobs WHERE MATCH (title,body) AGAINST ('developer')

Я думал, что MySQL может найти эти записи с помощью "разработчика". Но почему это не сработало?

3 ответа

Вы можете переключиться на полный текст с помощью логических операторов: http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html

И искать:

SELECT * FROM jobs WHERE MATCH (title,body) AGAINST ('developer*' IN BOOLEAN MODE)

Сначала вы получите совпадения для "разработчика", затем "разработчиков" или любой строки, начинающейся с "разработчика". Это хорошо для длинных точных слов "разработчик", но поиск "car *", например, может привести к множеству неожиданных результатов, таких как "карточка", "кардамон",....

Я не думаю, что есть грамматический анализ в полнотекстовом поиске MySQL. Я на самом деле исследовал эту проблему сегодня и не нашел ничего лучшего.

РЕДАКТИРОВАТЬ

Этот метод не работает для таких слов, как "party" (множественное число: "party"). Если ваша форма поиска ограничена английским языком, я думаю, что вы можете охватить большинство случаев с помощью некоторых простых грамматических правил, и для каждого слова ищите слово и его множественное число. И если это неправильно, это, вероятно, приведет к неверному слову, которое должно быть нейтральным в вашем поиске.

select * from index_table where item_name rlike '[[:<:]]preform[s]*[es]*[ies]*[[:>:]]';

Проверьте, помогает ли это. В моем случае это сработало. Хотя не будет охватывать все множественное число, но да для 90-95% случаев.

Ура, Ашиш

Функциональность полнотекстового поиска в MySQL удивительна, но не реализует несколько обязательных функций, таких как выделение корней. Если для вас это критично, рассмотрите следующие варианты:

  1. Используйте логический режим: это было рекомендовано в одном из предыдущих ответов, я не буду вдаваться в подробности, плюсы и минусы здесь
  2. Предварительная обработка входных параметров запроса: добавить или удалить множественное/единственное число перед запуском запроса. Конечно, это не идеально, есть несколько минусов, которые следует учитывать.
  3. Используйте lucene: хотя полный текст mysql — это круто, настоящая система индексации лучше справляется со сложностями, присущими естественному языку.
Другие вопросы по тегам