удалось разыскать список эээ, похоже что основ слов (говорили мне учиться в школе ;-() на основании словарей Зализняка, Мюллера объем порядка 14Кб
lagif: ЗодчийТеней, Это было, наверняка, дерево, по буквам, как у Андрея Коваленко.
Почитайте тут: http://linguist.nm.ru/ling/rus/help.htm (пункт 3 особенно)
кажется мне что ваш поиск ясче недавно работал пошустрее, да и релевантность выдаваемых документов по-моему тоже изменилась, и не в лучшую сторону :-(, попробуйте поискать по слову "тестирование" и сравните документы в начале и документы в конце
з.ы. и сдается мне что украинский эквивалент было бы логичнее в этом случае скинуть в конец, человек то задал поиск на русском языке
никаких проблем, просто заинтересовала часть в агенте, а именно "Mozilla/4.0", спайдер эмулирует работу браузера? смысл? лишние ресурсы, ули указано для красоты?
приведенный пример лишь один из вариантов, но как и любой другой он имеет свои минусы, для примера подобный механизм по базе объемом в 53 тыс строк (примерно 30Мб) ищет порядка 0,02 сек, реливантность результата как для каталога сайтов удовлетворительна, но вот при увеличении количества записей до примерно ~200 тыс строк и объемах более таблицы 100Мб уже начинаются серьезные тормоза и резкое увеличение нагрузки на ресурсы. Поэтому выбор метода будет упираться в актуальности затрачиваемых усилий. Хочешь действительно качественный поиск юзай индексы. Думаю что в твоем случае с головой хватит только лишь обратного индекса.
Tarry: Это все очень хорошо, но причем тут FULLTEXT? Зачем городить кучу LIKE если есть готовый механизм поиска по FULLTEXT INDEX?
MATCH `поле` AGAINST ('запрос') уже выдает мне некое число, Вот это уже ближе к истине, ибо так оно и есть. Но boolean mode нужен для модификации словосочитаний по +*- итд. Так что без него не куда...
А релевантность boolean mode как раз выдается либо 0 либо 1. Так что приходится комбинировать эти два типа. Засада, короче.
http://dev.mysql.com/doc/refman/4.0/ru/reference.html Вам поможет, разберитесь для начала с языком запросов, что и как работает, тогда Вы поймете что именно Вам выдает MATCH, что такое "релевантность boolean mode" и почему куча LIKE лучше кучи MATCH`а. Удачи.
Tarry: А в механизме расчета релевантности в MySQL FULL TEXT.
если Вы не относите эту часть к запросу, думаю что Вы сами не совсем понимаете свою же проблему. Со совей стороны могу посоветовать лишь одно, избавьтесь в запросе от множества MATCH, сильно тормозит и введите весовые коэффициенты, попробуйте что-то вроде
$query = "SELECT `search`.*, "
." IF (search like '%".$text."%', 3*10, 0) "
." + IF (search LIKE '%".str_replace(" ", "%', 9, 0) + IF (search LIKE '%", $text)."%', 9, 0) AS relev"
." FROM `search` "
." WHERE (`search`.`search` LIKE '%".str_replace(" ", "%' OR `search`.`search` LIKE '%", $text)."%') "
." ORDER BY relev DESC";
Где соответственно $text это Ваш поисковый массив. $n количество поисковых слов. Выборку по нескольким полям довьте сами.
удалось разыскать список эээ, похоже что основ слов (говорили мне учиться в школе ;-() на основании словарей Зализняка, Мюллера объем порядка 14Кб
ЗодчийТеней, Это было, наверняка, дерево, по буквам, как у Андрея Коваленко.
Почитайте тут: http://linguist.nm.ru/ling/rus/help.htm (пункт 3 особенно)
тоже как вариант
Имхо, это были правила (регекспы, допустим) и исключения ;)
регекспы может быть, но всеже 300Кб? Это ведь без компрессии
насчет пошустрее апшипся, похоже был временный глюк, или кешируете результаты?
ёёёё, а какже кодировки?
http://index.online.ua/?q=18 самый низ страницы, не зачет :-(
ессесно может, и не только он
кажется мне что ваш поиск ясче недавно работал пошустрее, да и релевантность выдаваемых документов по-моему тоже изменилась, и не в лучшую сторону :-(, попробуйте поискать по слову "тестирование" и сравните документы в начале и документы в конце
з.ы. и сдается мне что украинский эквивалент было бы логичнее в этом случае скинуть в конец, человек то задал поиск на русском языке
мдя, забавный человек Ваш шеф, пламенный ему привет :-)
никаких проблем, просто заинтересовала часть в агенте, а именно "Mozilla/4.0", спайдер эмулирует работу браузера? смысл? лишние ресурсы, ули указано для красоты?
www.online.ua spider like Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
кхе-кхе :-)
кризис жанра миновал ;-)
приведенный пример лишь один из вариантов, но как и любой другой он имеет свои минусы, для примера подобный механизм по базе объемом в 53 тыс строк (примерно 30Мб) ищет порядка 0,02 сек, реливантность результата как для каталога сайтов удовлетворительна, но вот при увеличении количества записей до примерно ~200 тыс строк и объемах более таблицы 100Мб уже начинаются серьезные тормоза и резкое увеличение нагрузки на ресурсы. Поэтому выбор метода будет упираться в актуальности затрачиваемых усилий. Хочешь действительно качественный поиск юзай индексы. Думаю что в твоем случае с головой хватит только лишь обратного индекса.
Это все очень хорошо, но причем тут FULLTEXT? Зачем городить кучу LIKE если есть готовый механизм поиска по FULLTEXT INDEX?
MATCH `поле` AGAINST ('запрос') уже выдает мне некое число, Вот это уже ближе к истине, ибо так оно и есть. Но boolean mode нужен для модификации словосочитаний по +*- итд. Так что без него не куда...
А релевантность boolean mode как раз выдается либо 0 либо 1. Так что приходится комбинировать эти два типа. Засада, короче.
http://dev.mysql.com/doc/refman/4.0/ru/reference.html Вам поможет, разберитесь для начала с языком запросов, что и как работает, тогда Вы поймете что именно Вам выдает MATCH, что такое "релевантность boolean mode" и почему куча LIKE лучше кучи MATCH`а. Удачи.
Умеющий уши да услышит!
А в механизме расчета релевантности в MySQL FULL TEXT.
если Вы не относите эту часть к запросу, думаю что Вы сами не совсем понимаете свою же проблему. Со совей стороны могу посоветовать лишь одно, избавьтесь в запросе от множества MATCH, сильно тормозит и введите весовые коэффициенты, попробуйте что-то вроде
$query = "SELECT `search`.*, "
." IF (search like '%".$text."%', 3*10, 0) "
." + IF (search LIKE '%".str_replace(" ", "%', 9, 0) + IF (search LIKE '%", $text)."%', 9, 0) AS relev"
." FROM `search` "
." WHERE (`search`.`search` LIKE '%".str_replace(" ", "%' OR `search`.`search` LIKE '%", $text)."%') "
." ORDER BY relev DESC";
Где соответственно $text это Ваш поисковый массив. $n количество поисковых слов. Выборку по нескольким полям довьте сами.