Полнотекстовый поиск - проблема с системой тегов - PullRequest
0 голосов
/ 17 октября 2010

Я храню теги в 255 областях, как этот тип;

", ключевое слово1, ключевое слово2, ключевое слово3, ключевое слово 324,", ключевое слово1234,

(ключевое слово должно начинаться и заканчиваться запятой (commakeyword123comma))

-

Я могу найти ключевое слово3, как этот SQL-запрос;

выбрать * из таблицы, где ключевое слово like = '%, keyword3,%'

CREATE TABLE IF NOT EXISTS `table1` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `tags` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `tags` (`tags`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2242 ;


INSERT INTO `table1` (`id`, `tags`) VALUES
(2222, ',keyword,'),
(2223, ',word is not big,'),
(2224, ',keyword3,'),
(2225, ',my keys,'),
(2226, ',hello,keyword3,thanks,'),
(2227, ',hello,thanks,keyword3,'),
(2228, ',keyword3,hello,thanks,'),
(2239, ',keyword3 but dont find,'),
(2240, ',dont find keyword3,'),
(2241, ',dont keyword3 find,');

(возвращает 2224,2226,2227,2228)

-

Я должен изменить эту команду для ПОЛНОГО ПОИСКА ТЕКСТА.

выбрать * из таблицы1, где совпадение (теги) с (", ключевое слово3" в логическом режиме)

команда sql find 2239,2240,2241, но я не хочу находить% keyword3% или keyword3

http://prntscr.com/137u9

идей только для поиска, ключевое слово3,?

, ключевое слово 3

спасибо

Ответы [ 3 ]

3 голосов
/ 17 октября 2010

Для этого нельзя использовать только полнотекстовый поиск - он ищет только слова.Вот несколько различных альтернатив, которые вы можете использовать:

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

  • Вы можете использовать FIND_IN_SET .

  • Вы можете нормализовать свою базу данных - хранить толькопо одному ключевому слову в строке.

    INSERT INTO `table1` (`id`, `tag`) VALUES
    (2222, 'keyword'),
    (2223, 'word is not big'),
    (2224, 'keyword3'),
    (2225, 'my keys'),
    (2226, 'hello'),   -- // 2226 has three rows with one keyword in each.
    (2226, 'keyword3'),
    (2226, 'thanks'),
    (2227, 'hello'),
    -- etc...
    

Из них я бы порекомендовал нормализовать вашу базу данных , если это вообще возможно.

0 голосов
/ 17 октября 2010

Прежде всего, FULL TEXT предназначен для текстового поиска.Так что есть ограничения на то, что вы можете с этим сделать.Чтобы сделать то, что вы хотите, вам нужно проверить спецификации Boolean Mode и посмотреть, может ли вам помочь оператор ", но даже при этом ваш поиск может быть не точным на 100%.Вам нужно навязать формат слов для ваших ключевых слов (желательно, чтобы внутри них не было разделителей слов, например ).

0 голосов
/ 17 октября 2010

Есть ли причина для хранения всех тегов в одной строке?

Я бы сохранил каждый "тег" в строке, затем сделал бы, как предлагает andreas, и сделал бы что-то вроде этого:

SELECT * FROM table1 WHERE tag IN('keyword0', 'keyword1', 'etc.')

Если вам по какой-то причине нужно вернуть все теги в один ряд, вы можете хранить их по отдельности и GROUP_CONCAT вместе.

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

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