За последние 24 часа нас посетили 22073 программиста и 1114 роботов. Сейчас ищут 752 программиста ...

Как организовать поиск из XML-данных?

Тема в разделе "PHP для профи", создана пользователем Денис Тар, 9 сен 2016.

Метки:
  1. Денис Тар

    Денис Тар Новичок

    С нами с:
    9 сен 2016
    Сообщения:
    26
    Симпатии:
    3
    Вводные данные.
    Есть архив номеров журнала. Данные представляют собой исходный PDF, откомпилированные PDF страницы вёрстки в SFW-формате и разметки XML для поиска. На том же SWF есть форма поиска, данные запрашиваются из соответствующего индекса, скомпилированного из PDF в XML.
    Для наглядности - рассматриваю конкретный пример с сайта http://ogni-sochi.ru/archs.php
    При нажатии на конкретный выпуск открываются SWF-страницы. В форме поиска запрос осуществляется к индекс-XML, имеющий разметку статья-страница журнала.
    Выглядит searchtext.xml подобным образом:
    HTML:
    1. <?xml version="1.0" encoding="utf-8" ?>
    2. <Search>
    3. <Pages Count="92">
    4.   <Page Number="1">1 огни сочи большого для всех 78 (76) июль август 2016 рубрика константин затулин: сочи нужна отдельная строка  в федеральном бюджете 7 8 (76) июль август 20 16 журнал для тех, кто любит наш город к ипотечным сделкам с через партнерские каналы продаж единство наций с сила россии. 30 июля с день дружбы все хоры в гости к нам! лидер предпринимательства сочи 2016 спецпроект константин затулин:  сочи нужна отдельная строка  в федеральном бюджете
    5.   </Page>
    6.   <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
    7.   </Page>
    8. ......
    9.   <Page Number="NN">NN www.ogni-sochi.ru 78 (76) июль - август 2016 огни сочи большого для всех рубрика
    10.   </Page>
    11. </Pages>
    12. </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 (и аналоги), встречающаяся для свободного скачивания на многих сайтах, но на деле, как оказалось, красивый дизайн целого Приложения не смог даже проиндексировать сайт. Подобных вещей не надо - не тратьте время даже.

    Буду рад любым конструктивным рекомендациям, готовым проверенным(!) на работоспособность конструкциям.
     
    #1 Денис Тар, 9 сен 2016
    Последнее редактирование модератором: 9 сен 2016
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    sphinxsearch, elasticsearch
     
  3. Денис Тар

    Денис Тар Новичок

    С нами с:
    9 сен 2016
    Сообщения:
    26
    Симпатии:
    3
    А они бесплатные бывают?
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Они оба бесплатные и opensource, ну может у второго на сайте это не сразу понятно.
     
  5. Денис Тар

    Денис Тар Новичок

    С нами с:
    9 сен 2016
    Сообщения:
    26
    Симпатии:
    3
    Поизучал, посмотрел (хоть и бегло) - и как-то слишком замудрено получается на движках.
    С первым - так вообще всё, что нашел через MySQL проходит. Т.е. получается, что на готовые изящные данные xml-вида теперь сверху еще и БД зачем-то накидывать.
    Задача не состоит в том, чтобы поиск осуществлять по всему интернету, более того - даже не по всему сайту, а лишь по папке с подпапками к xml-файлам, которых в будущем-то свыше 200 едва ли возникнет.
    Неужели нет более простого способа написания на php скрипта, ищущего в xml-индексах поисковые фразы и выдающего в динамике в привычном html-виде?
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Такое легко самому написать, открываем все xml файлы по очереди, в открытых файлах можно через xpath искать.
    По идее там 10 строк кода.
     
    Fell-x27 нравится это.
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
  8. Денис Тар

    Денис Тар Новичок

    С нами с:
    9 сен 2016
    Сообщения:
    26
    Симпатии:
    3
    Как просто xml-документ вывести, я уже научился. Но вот непонимания как поиск внутри осуществлять, да еще, чтобы на выводе не вся PDF-страница выходила, точнее, её компиляция, а фраза из того xml, в которой участвовал поисковый запрос (как это сделано в Google'е или Яндексе-поисковике.
    Т.е. вида:
    Описание ссылки 1. Много-много-текста ПОИСКОВЫЙ ЗАПРОС (СОВПАДЕНИЕ)...
    Описание ссылки 2. Много-много-текста ПОИСКОВЫЙ ЗАПРОС (СОВПАДЕНИЕ)...
    и т.д.
    - Здесь я выделил курсивами, жирным для наглядности. Хотя стили никто не отменял, но это уже другая задача для CSS.
     
  9. Денис Тар

    Денис Тар Новичок

    С нами с:
    9 сен 2016
    Сообщения:
    26
    Симпатии:
    3
    Мне примерно такое и надо. Только XPath, как я понял, читая др. источники, Узлы определяет, а у меня ведь задача получается другой, насколько сам улавливаю.
    Получается, что в большом тексте XML (сейчас про переборку открыванием каждого файла пока не говорим - это уже совсем другой алгоритм), мой Searh.php должен обнаружить сочетание введенных слов, взять вдобавок часть информации вокруг этих слов (или слова), из ближайшего впереди стоящего тега <Page> считать его Number="NN" и выдать пользователю страницу примерно следующего вида:
    http://мой-сайт.ru/архив_номеров/Журнал№aaa/index.html?pageNumber=aNN Текст текст текст Поисковое совпадение 1 текст текст текст
    http://мой-сайт.ru/архив_номеров/Журнал№bbb/index.html?pageNumber=bNN Текст текст текст Поисковое совпадение 1 текст текст текст
    и т.д....
    Здесь:
    aaa, bbb - номера журналов (это я другим скриптом нахожу при переборе в папках),
    aNN, bNN - номера страниц, извлекаемые при нахождении совпадений в ближайших тегах <Page>.
    - Вот на этих местах основные вопросы и возникают.
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    поиск по тексту по xpath вернёт узел в котором будет весь текст который вы ищите

    так как будет возвращена ссылка на весь узел Page то из него можно будет получить Number

    В тексте фразу которую искали можно заменить на фразу обёрнутую в тег <b> тогда она будет выделена жирным

    Теперь можно попробовать вывести узел который вернёт xpath
     
    Денис Тар нравится это.
  11. Денис Тар

    Денис Тар Новичок

    С нами с:
    9 сен 2016
    Сообщения:
    26
    Симпатии:
    3
    Спасибо! Буду пробовать всеми возможными способами.