Роберт
Аналитик
Подсветка в соттветсвтии с FullText
Может кто-то уже когда-нибудь писал подсветку работающую в ПОЛНОМ соответсвии с работой полнотекстового поиска MySQL'a?
Не хочется изобретать велосипед если он уже существует.
Когда-то сам писал подобную функцию , но полного соотвествия достичь так и не удалось , то и дело всплывали какие-то неучтёные моменты. Например в описании MySQL говорится что в полнотекстовом поиске учавствуют только слова состоящие более чем из трёх символов. Действительно - если я буду искать:
XPB 77
или
"XPB 77"
то абсолютно ничего не найду как бы ни хотел (даже плюсы не помогут , которые преодолевают ограничение стоп-словах которые фигурируют более чем в 50% строк). Вроде кажется всё просто - для нахождения слов которые надо подсветить пишем preg_math("#\w{4,}#,$СтрокаПоиска,$МассивСловПодвсетки); Но не тут-то было! Если в кавычках хотя бы одно слово больше тёх символов - то и все остальные слова состоящие из 1-3 букв , которые вроде как по описанию не должны были принимать участие в поиске - тоже задейтсуются. Тоесть при поиске "ABVG 77" - он будет искать именно такую строку , а не просто ABVG. И тогда нам приходится выделять уже фразы , например через preg_math("#(\".+?\"|\w{4,})#,$СтрокаПоиска,$МассивФразДляПодвсетки); При этом нам надо будет потом ещё выкинуть из этого массива все строки в которых нет ни одного слова больше трёх символов. А дальше каждый элемент этого массива экейпите через preg_quote и почти всё готово чтобы их ипользовать через preg_replace("#{$МассивФразДляПодвсетки[0][$n]}#i",'<b>\\0</b>',$Текст); Правда к этому надо ещё добавить что если в базе данные есть строка - "ABVG - (@@@) # {} [] =- 77" , то она тоже будет найдена при полнотекстовом поиске , а значит в нашем массиве фраз для подсветки нам надо будет заменить все НЕтерменальные символы на \W+ чтобы в последствии в выделяющий блок захватывались все эти промежуточные НЕ буквы которыме в данном случае попали в диапазон между ABVG и 77. Впрочем то что я писал выше о \w и \W - тоже не получится , в зависимости от кодироки (у меня напимер UTF8) придётся использовать явный набор букв своего алфавита. Но и тут мы ещё сталкнёмся с проблемами - напимер мы искали в базе данных слово "МЁРТВЫЙ" , а нашли слово "Мертвый". Если большие и маленькие буквы для нас не имеют значения , так как мы подсвечиваем с модификатором патерна "i" , то вот Ё на Е регулярные выражения в отличии от MySQL'а поменять не смогут , и такие плавающие буквы для каждого языка вам придётся усже вылавивать и заменять самому (скажем в данном случае все Е и Ё должны быть заменены на [ЕЁ]).
Это тот принцип по которому реализовал подсветку я. Велосипед вроде ездиит , но то и дело всё-таки спотыкается. По этому ещё раз спрошу - может кто-то такую же работу проделывал и до меня? Может кто-то заглядывал в исходники MySQL и нашёл ещё какие-то неучтёным мною особенности поведения базы и добавил что-то в алгоритм подсветки чтобы она работал в ПОЛНОМ соответсвии с полнотектовым поиском?
Может кто-то уже когда-нибудь писал подсветку работающую в ПОЛНОМ соответсвии с работой полнотекстового поиска MySQL'a?
Не хочется изобретать велосипед если он уже существует.
Когда-то сам писал подобную функцию , но полного соотвествия достичь так и не удалось , то и дело всплывали какие-то неучтёные моменты. Например в описании MySQL говорится что в полнотекстовом поиске учавствуют только слова состоящие более чем из трёх символов. Действительно - если я буду искать:
XPB 77
или
"XPB 77"
то абсолютно ничего не найду как бы ни хотел (даже плюсы не помогут , которые преодолевают ограничение стоп-словах которые фигурируют более чем в 50% строк). Вроде кажется всё просто - для нахождения слов которые надо подсветить пишем preg_math("#\w{4,}#,$СтрокаПоиска,$МассивСловПодвсетки); Но не тут-то было! Если в кавычках хотя бы одно слово больше тёх символов - то и все остальные слова состоящие из 1-3 букв , которые вроде как по описанию не должны были принимать участие в поиске - тоже задейтсуются. Тоесть при поиске "ABVG 77" - он будет искать именно такую строку , а не просто ABVG. И тогда нам приходится выделять уже фразы , например через preg_math("#(\".+?\"|\w{4,})#,$СтрокаПоиска,$МассивФразДляПодвсетки); При этом нам надо будет потом ещё выкинуть из этого массива все строки в которых нет ни одного слова больше трёх символов. А дальше каждый элемент этого массива экейпите через preg_quote и почти всё готово чтобы их ипользовать через preg_replace("#{$МассивФразДляПодвсетки[0][$n]}#i",'<b>\\0</b>',$Текст); Правда к этому надо ещё добавить что если в базе данные есть строка - "ABVG - (@@@) # {} [] =- 77" , то она тоже будет найдена при полнотекстовом поиске , а значит в нашем массиве фраз для подсветки нам надо будет заменить все НЕтерменальные символы на \W+ чтобы в последствии в выделяющий блок захватывались все эти промежуточные НЕ буквы которыме в данном случае попали в диапазон между ABVG и 77. Впрочем то что я писал выше о \w и \W - тоже не получится , в зависимости от кодироки (у меня напимер UTF8) придётся использовать явный набор букв своего алфавита. Но и тут мы ещё сталкнёмся с проблемами - напимер мы искали в базе данных слово "МЁРТВЫЙ" , а нашли слово "Мертвый". Если большие и маленькие буквы для нас не имеют значения , так как мы подсвечиваем с модификатором патерна "i" , то вот Ё на Е регулярные выражения в отличии от MySQL'а поменять не смогут , и такие плавающие буквы для каждого языка вам придётся усже вылавивать и заменять самому (скажем в данном случае все Е и Ё должны быть заменены на [ЕЁ]).
Это тот принцип по которому реализовал подсветку я. Велосипед вроде ездиит , но то и дело всё-таки спотыкается. По этому ещё раз спрошу - может кто-то такую же работу проделывал и до меня? Может кто-то заглядывал в исходники MySQL и нашёл ещё какие-то неучтёным мною особенности поведения базы и добавил что-то в алгоритм подсветки чтобы она работал в ПОЛНОМ соответсвии с полнотектовым поиском?