Я создал файловый индексатор, который просто вставляет имена файлов в указанную таблицу. Теперь я рассматриваю лучший способ поиска имен файлов. В таблице может быть 100000+ файлов, поэтому производительность важна.Оптимальный поисковый запрос и структура для запроса большого набора данных
Имя файла может быть различным - длиной 10, 20, 50 или более символов. По крайней мере, на данный момент мой тестовый набор данных не содержит файлов с именами. Пользователь может выполнять частичный поиск, например, ищет «1001» должен вернуть файл с именем 10_1001_20_30_40_50.
Моя текущая структура таблицы:
CREATE TABLE `file` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`id_category` int(10) unsigned NOT NULL,
`filename` varchar(255) NOT NULL,
`file_ext` varchar(3) NOT NULL,
`date_added` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`,`id_category`),
KEY `idx_file_filename` (`filename`) USING BTREE,
KEY `fk_file_1_idx` (`id_category`),
FULLTEXT KEY `filename` (`filename`)
) ENGINE=MyISAM AUTO_INCREMENT=24974 DEFAULT CHARSET=utf8;
INSERT INTO `file` (`id`,`id_category`,`filename`,`file_ext`,`date_added`) VALUES (22474,14199,'095_98_1002_1003_148_98_1001_003','pdf','2016-03-19 19:02:12');
INSERT INTO `file` (`id`,`id_category`,`filename`,`file_ext`,`date_added`) VALUES (22475,14199,'095_98_1002_1003_148_98_1001_001','pdf','2016-03-19 19:02:11');
Я пытался использовать MATCH() AGAINST(), но оказалось, что это не очень хорошая идея, если у вас нет пробелов в строке и хотите do "if string содержит поиск":
SELECT id, filename FROM `file` WHERE MATCH(filename) AGAINST ('1002*' IN BOOLEAN MODE);
Это не собирается возвращать то, что мне нужно. Что я рассматриваю это использование FULLTEXT раздельным всех имен файлов при импорте в 3 длины частей, разделенных пробелами и их использовать запросы, как это (мин пользователем длина строки может обеспечить.):
SELECT * FROM `file` WHERE MATCH(filename) AGAINST ('100*' IN BOOLEAN MODE);
Конечно, я могу оставить имена файлов, как они есть, и использовать LIKE оператора:
SELECT * FROM `file` WHERE filename LIKE '%100%'
но есть много негативных мнений по поводу использования LIKE для больших наборов данных. Мне интересно, будет ли мое решение с добавлением пробелов в имена файлов.
Ale Вы ищете только 1002, или вам нравится искать более длинные последовательности (1002_1003) тоже? –
Это может быть любой запрос> = 3 символа –