Подберите частичные слова с помощью полнотекстового поиска MySQL? - PullRequest
3 голосов
/ 27 октября 2011

В качестве примера у меня есть следующая схема базы данных:

CREATE TABLE IF NOT EXISTS `items` (
  `id` int(11) unsigned NOT NULL,
  `irn` varchar(30) NOT NULL,
  `name` varchar(225) NOT NULL,
  `description` text,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `name_desc_irn` (`name`,`description`,`irn`),
  FULLTEXT KEY `name` (`name`),
  FULLTEXT KEY `description` (`description`),
  FULLTEXT KEY `irn` (`irn`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

И следующие данные (предположим, что данные здесь упрощены, в действительности у меня более 100 000 записей)

id    name        irn          description     
1     Widget A    ABC12345     testing ABC12345
2     Widget B    ABC-12345    the ABC is great

И следующий запрос:

SELECT
    items.id as id,
    items.irn as irn,
    items.name as name,
    (
        ((MATCH (irn) AGAINST ('12345')) * 5) + 
        ((MATCH (name) AGAINST ('12345')) * 4) + 
        ((MATCH (description) AGAINST ('12345')) * 3) + 
        (MATCH(name, description, irn) AGAINST ('12345'))
    ) AS relevance 
FROM
    items 
WHERE 
    MATCH(name, description, irn) AGAINST ('*12345' IN BOOLEAN MODE)
HAVING
    relevance > 0
ORDER BY
    relevance DESC

Возвращается второй результат (код ABC-12345), но не первый (ABC12345).Почему он не соответствует ABC12345, но соответствует ABC-12345?Есть ли способ сделать так, чтобы они совпадали с помощью полнотекстового поиска?Если нет, каков наиболее подходящий способ проведения такого поиска, когда при поиске 12345 обнаруживаются оба ABC12345 и ABC-12345?

1 Ответ

2 голосов
/ 27 октября 2011

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

Единственным вариантом для этого конкретного типа запроса может быть изменение условия where на что-то вроде:

WHERE irn LIKE '%12345' OR name LIKE '%12345' OR description LIKE '%12345'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...