Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Как организовать поиск из XML-данных?, Требуется реализовать поиск и вывод информации их XML
Denis Tar  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 15
Пользователь №: 43358
На форуме: 3 месяца, 1 день
Карма:




Вводные данные.
Есть архив номеров журнала. Данные представляют собой исходный PDF, откомпилированные PDF страницы вёрстки в SFW-формате и разметки XML для поиска. На том же SWF есть форма поиска, данные запрашиваются из соответствующего индекса, скомпилированного из PDF в XML.
Для наглядности - рассматриваю конкретный пример с сайта http://ogni-sochi.ru/archs.php
При нажатии на конкретный выпуск открываются SWF-страницы. В форме поиска запрос осуществляется к индекс-XML, имеющий разметку статья-страница журнала.
Выглядит searchtext.xml подобным образом:
<?xml version="1.0" encoding="utf-8" ?>
<Search>
<
Pages Count="92">
<
Page Number="1">1 огни сочи большого для всех 78 (76) июль август 2016 рубрика константин затулин: сочи нужна отдельная строка в федеральном бюджете 7 8 (76) июль август 20 16 журнал для тех, кто любит наш город к ипотечным сделкам с через партнерские каналы продаж единство наций с сила россии. 30 июля с день дружбы все хоры в гости к нам! лидер предпринимательства сочи 2016 спецпроект константин затулин: сочи нужна отдельная строка в федеральном бюджете
</Page>
<
Page Number="2">2 78 (76) июль август 2016 огни сочи большого для всех рубрика отель «жасмин» – отдых в удовольствие! отдых абхазия агурское ущелье аквапарк лоо сплав по реке «33 водопада» вечерний сочи красная поляна мацестинский чай змейковские водопады изумрудная долина «в гостях у пасечника» женский монастырь дельфинарий дача сталина дерево дружбы обезьяний питомник в гостях у шапсугов воронцовские пещеры экскурсии трансфер (10 комфортабельных автобусов) комбинированные экскурсии перевозки рабочего персонала наш транспорт ооо «виктория» сочи, пос. кудепста, сухумское шоссе, 50/2, тел. 8-918-101-80-01, 8-800-222-70-80 (бесплатный звонок) www.viktoriasochi.ru e-mail: tcakunova@yandex.ru
</Page>
......
<
Page Number="NN">NN www.ogni-sochi.ru 78 (76) июль - август 2016 огни сочи большого для всех рубрика
</Page>
</
Pages>
</
Search>


Имеются файлы (как понимаю) с данными о вхождениях слов для каждой страницы search1.xml ... searchNN.xml
Пример:
search2.xml
...
абхазия:729:2835:0:127:65;125;172;231;285;345;400
агурское:729:2984:0:127:65;108;158;220;273;329;387;446
ущелье:1195:2984:0:127:50;135;193;249;303;361
...


Возникла необходимость организовать аналогичный поиск, только уже среди всех загруженных на сайт выпусков журнала.
Т.е. искать будем не в одном searchtext.xml, а во всех. В общем виде структура такова:
  • Адрес_сайта.ru/Архив_номеров/Номер_001/searchtext.xml
  • ... (Структура 1)
  • Адрес_сайта.ru/Архив_номеров/Номер_NNN/searchtext.xml


Вопрос и мысли к решению, но пока не давшие ответа.
1. Ставим в любое место на сайте форму ввода запроса на поиск - тут всё понятно.
2. По нажатию кнопки "ОК" отправляем строку запроса обработчику search.php.
3. Этот search.php проверят введенную строку, режет лишние знаки "пробел", приводит буквы к строчным и т.д.
4. Сам поиск. (Тут у меня и начинаются вопросы)...
Где искать? В Структуре 1, описанной выше?
Или всё-таки необходимо при выпуске каждого очередного номера, пополнять Индекс-индексов, в котором будет храниться сбор из ~NN/searchtext.xml с дополнительным тегом, сообщающем о NN-номере издания?
5. Что искать?
Я понимаю как в файле строковыми функциями найти первое вхождение субстроки в строку, но как быть с последовательностью слов - остается "белое пятно". В особенности касается семантики с использованием регулярных выражений.
Если запрос будет, например, "Марию Иванову назначили директором", то регулярное выражение + строковая функция должны порезать фразу на массив из нескольких слов с неопределенными окончаниями? - Верно ли понимаю, что искаться будет каждое слово по-отдельности, но не фраза? Либо фраза, но при полном соответствии субстроки из всего текста индекс-документа строке запроса? Разумеется все символы верхнего регистра и там, и там приведены к строчным.
6. От готовых сервисов поиска, как Google или Яндекс заведомо отказываемся, потому как им требуется время для прощелкивания сайта, что в корне неправильно, когда информация уже загружена на сервер, а найти её не получилось.
Я пробовал поиск от Яндекс - и он довольно хорошо справился с поиском, как внутри обычных текстовых документов, самих php-страниц, а также
searchtext.xml-файлов (это - единственный момент - оптимизация для поиска - приятно порадовал меня, как разработчика).
Если первые запустились как вэб-страницы, то вторые - разумеется, показали лишь разметку, в которой можно продолжить поиск CTRL+F, что, конечно, мягко говоря, некрасиво и нефункционально для обычного пользователя, не ищейки.

Есть целая админка phpsearch (и аналоги), встречающаяся для свободного скачивания на многих сайтах, но на деле, как оказалось, красивый дизайн целого Приложения не смог даже проиндексировать сайт. Подобных вещей не надо - не тратьте время даже.

Буду рад любым конструктивным рекомендациям, готовым проверенным(!) на работоспособность конструкциям.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Игорь_Vasinsky  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Лысый и злой
******

Профиль
Журнал
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 25994
Пользователь №: 21350
На форуме: 6 лет, 8 месяцев, 26 дней
Карма: 725

Не курю:
1 год, 2 месяца, 13 дней


яб не парился с поиском в файлах
яб при импорте xml - парсил бы его в бд с привязкой к файлу
потом искал бы в бд и выводил бы нужный файл


--------------------
Халявные ответы кончились.
Если нужен готовый код - готовьтесь заплатить.
Райкин тоже был артист

Возле дома был сарай
А когда всё хорошо
Можно просто покурить

user posted image
http://ufa102.xyz/
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Denis Tar  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 15
Пользователь №: 43358
На форуме: 3 месяца, 1 день
Карма:




Цитата
яб при импорте xml - парсил бы его в бд с привязкой к файлу

Я боюсь тут за вот какие вещи:
1. По сути я задвою использованный ресурс.
2. Это дополнительная процедура, которая, пожалуй, излишня.
3. Файлы searchtext.xml - сами-по-себе довольно объемны, ведь они являются по-сути компиляцией PDF-ов в текстовый вид.
4. Эти же searchtext.xml уже содержат данные на страницы, в которых находится поисковый запрос - так зачем к уже готовому что-то еще прикручивать? Этим - хочется брать и пользоваться! Разработчики этого PDF-компилятора уже позаботились о многом.

Попробуйте открыть любой из последних номеров http://www.ogni-sochi.ru/archs.php - там уже есть Поиск; никакие БД не задействованы.
У меня задача - расширить уже готовый продукт с масштабов одного номера журнала до всех.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Denis Tar  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 15
Пользователь №: 43358
На форуме: 3 месяца, 1 день
Карма:




Так ничего путнего ни от кого и не дождался.
Задачу решил. Отвечаю сам. Вдруг, кому-то пригодится.
"мой-сайт" замените на адрес вашего сайта, разумеется.
<!-- Часть самой формы я заменил, выведя её в отдельный файл
<form method="GET" action="search_pdf.php">
<div class='search_box' align=right>
<input type="search" size="40" name="ainput" class="input_w" placeholder="Поиск...">
<button class="icon_search"><i class="fa fa-search"></i></button>
<input type="submit" value="Найти">
</div>
</form>
-->


<?

if (isset ($_GET['ainput'])) {
$ainput=$_GET['ainput'];
if (strlen($ainput)>0) {

for ($i=999; $i>1; $i--) { // от текущего выпуска двигаемся к первому
// ===== CONFIG =====
// ссылка на типовую страницу имеет вид:
// $file_path_pattern = 'http://мой-сайт.ru/pdfs/obs076www/index.html?pageNumber=2';
// здесь несколько дробленых частей полного адреса для дальнейшей шаблонизации

$issue_num = $i; $issue_num_img = $i;
$file_path_start = 'http://мой-сайт.ru/pdfs/obs';
if ($i<50) { // необязательно, в моем случае номера до 50-го имели
// ХХ-шифр в нумерации, с 50-го ХХХ, т.е.: .."48", "49","050", "051", ...

$issue_num_str = (string)$issue_num;
} else { $issue_num_str = (string)'0'.$issue_num; }

if ($i>99) {
$issue_num_str_img = (string)$issue_num_img;
} else { $issue_num_str_img = (string)'0'.$issue_num_img; }

$file_path_dirend = 'www';
$file_path_serchend = '/files/search/';
$file_path_pagenum ='/index.html?pageNumber=';
$filenamexml_one = 'searchtext.xml';
$link_page = $file_path_start.$issue_num_str.$file_path_dirend.$file_path_pagenum;
$filenamexml = $file_path_start.$issue_num_str.$file_path_dirend.$file_path_serchend.$filenamexml_one;
// $filenamexml = 'http://мой-сайт.ru/pdfs/obs076www/files/search';

// ===== QUERY =====
// задаем шаблон выборки

$aquery = '/Search/Pages/Page[contains(.,"'.$ainput.'")]/text()';
$xml = null;
$xml = simplexml_load_file($filenamexml);
$nodes = null;
$nodes = $xml->xpath($aquery);
$n = count($nodes);

// вывод я решил организовать в таблицы с оформлением CSS, соответствующими моему сайту, где:
// 1-й столбец отображает IMG обложки
// 2-й столбец - IMG самой страницы
// 3-й столбец - предложения с текстовыми совпадениями, соответствующими введенному пользователем запросу


print '<table class="img_shadowAny" width=80% align=center><tr><td width=250 valign=top><font class="textcontents">';
// 1-й столбец отображает IMG обложки
print '<img src="http://мой-сайт.ru/archs/no'.$issue_num_str_img.'.jpg" width=135 height=185 class="img_shadowAny"><br>';

print '<b>Выпуск № '.$i.'</b><br>';
print 'По запросу<br><b><i>"<font color=#0000ff size=+1>'.$ainput.'</font>"</i></b><br>';
print 'найдено <font color=#ff0000 size=+1><b>'.$n.'</b></font><br>результат(~а,~ов)</font></td>';
print '<td valign=top>';
foreach ($nodes as $node) {
// print '<br>';
// ===== В переменную и на вывод Number-Page =====

$anum = $node[Number];

print '<table><tr>';
// 2-й столбец - IMG самой страницы
print '<td width=120 valign=top>';
$img_page = $file_path_start.$issue_num_str.$file_path_dirend.'/images/page'.$anum.'_thumbnail.jpg';
print '<a href="'.$link_page.$anum.'" target=_blank>';
print '<img src="'.$img_page.'" class="img_shadowAny"></a>';
print '</td>'; // from DIV-imgPage
// 3-й столбец - предложения с текстовыми совпадениями

print '<td valign=top><font class="textcontents">';
print '<a href="'.$link_page.$anum.'" target=_blank>';
print '<b><u>Выпуск № '.$issue_num.', стр. '.$anum.'</u></b></a><br><span class="textgray">';
// print '<font color=#00aa00><b>'.$anum.'</b></font><br>';

// ===== В переменную и на вывод ТЕКСТА СТРАНИЦЫ =====

$Atextpage = (string) $node[0];

// регулярным выражением делю string-страницы на массив предложений (всё, что попадает между знаками "?", "!" и ".")
// тут есть нюанс: в предложениях с сокращениями, вроде "т.д.", "т.п.", "проч." и др.
// обрезка будет до 1-й точки.
// ВАЖНО: в XML-файле текст между открывающими и закрывающими тегами <Page Number="NN">. фрагмент текста. </Page>
// Должен иметь точки. Либо - задем соответствующую регулярку с ^ (начало) и $ (окончание) выражения.
// Для моей задачи оказалось вполне достаточно того, как описано здесь

$sentence_arr = preg_split('/[?!.]+/',$Atextpage);

foreach ($sentence_arr as $sentence_str) {

// для проверки вхождения подстроки в строку я использовал функцию strpos>0, но можно и другими вариантами
$pos_search = strpos($sentence_str,$ainput);
if ($pos_search > 0) {
$sentence_str = str_ireplace($ainput,'<font color=#000000><b>'.$ainput.'</b></font>',$sentence_str);
print $sentence_str.'(...)';
} // from-if
} // from-foreach $sentence_arr


print '</span><br><br>';
print '</font></td>'; // from DIV-textSearch
print '</tr></table>'; // from DIV-resultSearch

}
print '</td></tr></table><br>';

} // from FOR $i

} else { print '<font class="textcontents">Введите больше трёх знаков</font>'; } }
else
{
print '<font class="textcontents">Вы ничего не ввели</font>';
}

// на практике оказалось, что не все откомпилированные из PDF,
// FLASH-файлы оказались в читабельном для этой программы виде
// за годы были использованы и разные версии компилятора,
// и сам я при экспорте мог по-разному настройки выдавать - так что
// для контроля, что прошли по каждому номеру - ввел еще одну строку:

print '<font class="textcontents"><br><hr><hr><hr>Выведены все найденные результаты<br><br></font>';
?>


Конечно, это - далеко не совершенство, но работает.
В отличии от готовых сервисов поисковиков (где не всё индексируется сразу),
этот поисковичок решает проблему поиска информации среди горы журналов,
если тексты их страниц увязаны с номерами посредством множества XML-файлов.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса