вывести часть TEXT поля, где впервые встречается искомое слово

clevel

Новичок
вывести часть TEXT поля, где впервые встречается искомое слово

делаю функцию поиска по полю типа longtext..Как делать релевантность, знаю, а вот какими функциями вывести часть контента, в котором первый раз встречается искомое слово, длинной не более 200 символов, не знаю..
помогите с данной ситуацией.
 

Макс

Старожил PHPClub
RTFM по string-functions !!!!

PS
substring()
+
position()
это по памяти, в мане все написано
 

clevel

Новичок
RTFM по string-functions !!!!

PS
substring()
+
position()
это по памяти, в мане все написано
нет, эти функции пхп... мне для этого контент надо из мускула вытягивать, что не есть хорошо... надо средствами мускула в момент выборки релевантности...
 

Vinny

Guest
Поиск по текстам используя БД? Имхо это извтрат, тормозить будет дико. Я подобную штуку реализовывал несколько иначе - индексировал тексты. При поиске выбирал только те тексты, в которых найдены необходимые слова, а парсил все это добро уже в php. Работает достаточно быстро.
 

clevel

Новичок
Поиск по текстам используя БД? Имхо это извтрат, тормозить будет дико. Я подобную штуку реализовывал несколько иначе - индексировал тексты. При поиске выбирал только те тексты, в которых найдены необходимые слова, а парсил все это добро уже в php. Работает достаточно быстро.
fulltext index чем не устаивает? тем более мускул - бинарник, а пхп - интерпритируемый язык. да и времени жалко, если еже до тебя специально такие вещи разработаны..
 

Vinny

Guest
Надо тестировать. ИМХО парсить текст на стороне php будет быстрее...
 

clevel

Новичок
Надо тестировать. ИМХО парсить текст на стороне php будет быстрее...
здрасьте, приехали...
для того, чтобы парсить на пхп, надо эти тексты вывести сначала с БД - кило по 10 каждая запись... только на вывод с мускула сколько времени уйдет, потом еже регами надо проверять... а match again при fulltext позволяет еще релевантность определить, даже если не полностью слово встречается, а какая-то его часть...
да и говорю, зачем продумаывть этот алгоритм, писать лишние кило кода, когда все это УЖЕ РЕАЛИЗОВАНО в муське, скомпилен БИНАРНИК, все работает...
пока не покажешь цифры, что пхп выигрывает существенно по скорости при обработке, скажем, не менее 300Кбайт данных, не поверю..
 

rembo

Новичок
clevel
Полнотекстовый поиск в мускуле это очень хорошо конешно.
Но если б ты получше почитал мануал, то ты бы обнаружил что не все так хорошо как кажется. Там в каждом абзаце практически приписывается что более менее нормально это будет работать только начиная с мускул 4.
 

Апельсин

Оранжевое создание
> Там в каждом абзаце практически приписывается что более менее нормально это будет работать только начиная с мускул 4.

"работать нормально" и полнотекстовый поиск "IN BOOLEAN MODE" - это немного разные вещи ;)
 

clevel

Новичок
Полнотекстовый поиск в мускуле это очень хорошо конешно.
Но если б ты получше почитал мануал, то ты бы обнаружил что не все так хорошо как кажется. Там в каждом абзаце практически приписывается что более менее нормально это будет работать только начиная с мускул 4
не увидел...
 

Vinny

Guest
2clevel:
Ты выхватил часть фразы и начинаешь на меня по этой части наезжать. Я не утверждал, что индексирование и поиск по индексам свое быстрее MySQL, но проверю. Если желаешь, зайди на www.titiles.ru и поищи что-нить. Сейчас там 3,4 метра текстов в базе и 228413 уникальных слов в словаре (не словоформ, именно слов). Но это лирика.
Изначально ты говорил, что ему получить часть текста вокруг найденного слова. Я писал когда-то поисковичек маленький, я знаю, какие возникают проблемы с получением этого кусочка текста, особенно когда у тебя присутствует несколько поисковых слов в тексте. Плюс к этому надо выводить полные слова, а не обрубать по +100 и -100 символов от слова. Плюст к этому хорошо бы выводить полностью предложение, если она начинается или заканчивается близко от этих пределов. И еще куча замут.
Так вот я говорил, что получение данного кусочка на php, имхо, будет работать бустрее чем в муське.
 

clevel

Новичок
Так вот я говорил, что получение данного кусочка на php, имхо, будет работать бустрее чем в муське.
представь себе следующую картину:
1.html-странички сайта хранятся в мускуле при fulltext индексе. Эти данные, естественно, и
просматриваются, И ДОБАВЛЯЮТСЯ, ИЗМЕНЯЮТСЯ. Сейчас мне проще просто сделать выборку части
строки по первому встречающемуся слову искомой словоформы +/-100 символов, далее полученную
строку отпарсить на наличие тегов, кусков тегов.. и вывести пользователю результат.
2.Ты предлагаешь хранить словарь слов. Я представляю себе его так:
2.1.4 таблицы - 1-ая -> слово/id, 2-я -> предложение/id, 3-я -> номер страницы/номер слова,
4-я -> номер предложения/номер слова/номер страницы.
2.2.ПРИ ЛЮБОМ ИЗМЕНЕНИИ СТРАНИЦЫ(вставка, обновление) нужно сделать следующее:
а) удалить все предложения этой страницы, связи ключевое слово/страница из 3-ей таблицы
(при обновлении)
б)отпрасить страницу на наличие тегов,strip_tags
в)разбить страницу на массив предложений, разделитель точка, точка с запятой
г)разбить каждое предложение на слова, каждое слово проверить на наличие в БД, если
его нет, добавить в БД (id слова autoincrement)
д)сделать вставку предложение в БД
е)заполнить таблицы 3,4.
Если учесть, что обновление данных будем систематическим раз в несколько дней, причем
update происходит через закачку с локальной машины, а также через dhtml форму на сайте,
то время на обновление словаря в режиме реального времени будет НАМНОГО большим, чем просто
FULLTEXT index.
Согласен в чем: скорость выборки при таком варианте хранения словаря будет быстрее, чем
fulltext index (поставить индекс на слова(5 первых символов)), и в результатах поиска будет выдавать
полное предложение, где первый раз встречается первое слово словоформы.
Недостатки:
1.объем словаря и предложений значителен
2.написание кода - желательно на сях - время
3.время при обновлении страниц - увеличиться значительно за счет проверки каждого слова
в мускуле.
Взвесим все за и против!
 

Vinny

Guest
Автор оригинала: clevel
сервер не найден..
сорри, быстро писал :) http://www.titles.ru/

Далее...
Расскажу какая у меня была ситуация. Мой скрипт вытягивал через url страницу, убивал все теги, отставляя только буквы, цифры и знаки препинания. Потом все это дело индексировалось. Точно сказать за какое время индексировалось не могу, да и факторов там было слишком много (толщина канала, загруженность и т.п.). При поиске искались те тексты, в которых встретились поисковые слова. Эти тексты брались из базы (кстати, они занимали не более 10 кб, хотя я индексировал для теста и www.dni.ru, и www.gazeta.ru, и www.lenta.ru) и начинали колбасится. Алгоритм там был совсем не +-100 - если находились два поисковых слова в диапазоне, диапазон расширялся и т.п. Если хочешь, могу выслать исходники всего этого, но там бардак, я не довел все до логического конца. На 700 P3 это занимало что-то около 1/100 сек при найденых 10 записях из где-то метра текста. Согласен, это не показатель, малые объемы, но...

В твоем случае, наверное, имеет смысл делать по другому.

Кстати, первоначально я хранил в базе еще и позиции слов в тексте, но что-то мне там не понравилось и я решил этого не делать, не помню, даавно это было.

Удачи.
 

clevel

Новичок
вышли... проанализируем...
все-таки ты со мной согласился, что в моем случае есть смысл просто пользоваться функциями БД
 

Vinny

Guest
Возможно, надо думать :)


Выложил скрипты на http://saterenko.ru/search.zip там интересны будут, пожалуй, только:
admin/file.php - индексатор
client/search.php - искалка
 

IgorYN

Новичок
Как это реализовать? ("вывести часть TEXT поля, где впервые встречается искомое слово")

-~{}~ 14.12.06 18:39:

Имеется ввиду через мускул
 
Сверху