Сперва делал выборку из базы по LIKE, но слишком часто перестал находить, добавил строкам индекс FULLTEXT, делаю запрос Код (PHP): "SELECT столбец2 FROM таблица WHERE MATCH (столбец1) AGAINST ('".$текст."') LIMIT 1" и получаю ошибку: Can't find FULLTEXT index matching the column list, в чём проблема? Подсказка от модератора: Любой код или текст конфигурации пишите между тегом [code=php] и [/code]. Используйте отступы в коде для форматирования текста. Это помогает быстрее понять вас, увеличивает шанс на получение ответа. Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
в том что полнотекстового индекса на "столбец1" не существует, наверное. учи английский. в тексте ошибки вообще все сказано. нефиг с такими вещами на форум обращаться.
я и так полиглот, а этот индекс я ставил и на столбец1, и на столбец2, может потому что у меня mariadb?
Код (PHP): CREATE TABLE IF NOT EXISTS `bot` ( `talk` text NOT NULL, `answer` text NOT NULL, FULLTEXT KEY `index` (`talk`,`answer`), FULLTEXT KEY `talk` (`talk`,`answer`), FULLTEXT KEY `tlk` (`talk`,`answer`), FULLTEXT KEY `talk_2` (`talk`,`answer`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; ой, кажется это все мои попытки добавить индекс Подсказка от модератора: Любой код или текст конфигурации пишите между тегом [code=php] и [/code]. Используйте отступы в коде для форматирования текста. Это помогает быстрее понять вас, увеличивает шанс на получение ответа. Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
восхитительно. я тут не вижу "столбец1". значит его действительно нет бай зе вей, а нафиг четыре одинаковых индекса делать?
так я думал если по-другому сделать, то предыдущий сам удалиться, а они вот все, столбец1 на самом деле answer
я весь гугл перерыл, не вспомню, подойдём с другой стороны, почему LIKE не подходит для чат-бота, ведь они выполняют одинаковые задачи насколько понимаю? есть в talk "здравствуй", но когда пишу "здравствуй друг дней моих суровых" (в шаблоне стояли с двух сторон %) он молчал?
ну ты сравнил жопу с пальцем. лайк ищет совпадение строки. то есть он будет каждую строку слева-направо читать в поиске этого совпадения. если ты сделаешь обычный индекс то будет искаться быстро для шаблонов вроде сло% - б-дерево и всё такое. работает быстро. а если будешь делать %лов% то никакой индекс не поможет потому что всё равно нужно перебирать всю строку и так для каждого кортежа. полнотекстовый индекс же он на то и полнотекстовый что дает возможность искать по слову и даже словоформе при этом выдерживая большие объемы текста. содержимое каждого поля разбивается на слова, слова на словоформы и по этому безобразию уже строится словарь. но это совершенно не имеет отношения к комбинированию индексов. ты сделаешь два отдельный хоть и полнотекстовых индекса для двух разных полей если у тебя поиск происходит либо по одному либо по другому. в общем ты как-то не так понял то что нагуглил.
ошибка то осталась, я только сегодня узнал о fulltext, так что не справлюсь, я тут подумал, почему бы не regexp/regex?
потому что регулярное выражение будет применяться на строки каждого кортежа. как и лайк. как и эквал. то есть на всю таблицу. полнотекстовый индекс ищет по словарю, который хранится отдельно и к которому предоставляется апи поиска - мач-эгейнст.
и всё таки я вот как решил сделать, учитывая что в базе 31 тыс шаблонов, возможность что по шаблону совсем ничего не найдётся равно 0,0001% Код (PHP): $string = explode(" ", $talk); $answ=mysql_query("SELECT answer FROM bot WHERE talk LIKE '%".$string[0]." ".$string[1]."%' LIMIT 1") or die(mysql_error()); if($answ) { while($answer=mysql_fetch_array($answ)) { echo $answer[0]; } } elseif(!$answ) { $answ2=mysql_query("SELECT answer FROM bot WHERE talk LIKE '%".$string[0]."%' LIMIT 1") or die(mysql_error()); if($answ2) { while($answer2=mysql_fetch_array($answ2)) { echo $answer2[0]; } } } elseif(!$answ2) { $answ3=mysql_query("SELECT answer FROM bot WHERE talk LIKE '%".$string[1]."%' LIMIT 1") or die(mysql_error()); if($answ3) { while($answer3=mysql_fetch_array($answ3)) { echo $answer3[0]; } } }