XML - результаты поиска/Поиск туров — различия между версиями

Материал из TourClient - Руководство пользователя
Перейти к: навигация, поиск
м (Алгоритм организации поиска)
м (Особенности работы)
Строка 21: Строка 21:
 
* минимальная цена точная (та которая в текущий момент минимальна в нашей БД по данным параметрам)
 
* минимальная цена точная (та которая в текущий момент минимальна в нашей БД по данным параметрам)
 
* по непопулярным запросам можно получить данных меньше чем в комбинированном поиске, если они в текущий момент не присутствуют в нашей БД (принципы работы комбинированного поиска не позволяют использовать его для выгрузки данных)
 
* по непопулярным запросам можно получить данных меньше чем в комбинированном поиске, если они в текущий момент не присутствуют в нашей БД (принципы работы комбинированного поиска не позволяют использовать его для выгрузки данных)
 +
* ответы сервиса не кешируются
  
 
==== Ограничения ====
 
==== Ограничения ====

Версия 13:44, 8 июля 2014

Использование сервиса

В зависимости от выбранного клиентом способа использования администрацией TourClient выставляется соответствующая настройка сервиса - тип поиска. Пользователю сервиса данная настройка недоступна.

Тип поиска определяет поведение сервиса и предоставляемые им данные.

Импорт данных в свою систему (тип поиска: БД)

Импорт данных в свою систему может производиться для получения каких-то статистических показателей. Например расчета минимальных по каким-то параметрам. Или же организации каких-то своих сервисов.


Сервис предоставляет только те данные которые в текущий момент сохранены в нашей БД.


Обратите внимание: сервис не предназначен для полной синхронизации БД клиента с нашей (из-за большого объема данных и очень интенсивной скорости обновления нашей БД). Архитектура получения данных в текстовом формате через xml-шлюз маленькими блоками не позволит работать с такими объемами данных, пропускной способности будет недостаточно для оперативного обновления данных (потенциально базу выкачать возможно, но она тут же устарает, и не будет успевать обновляться по данной технологии).


Сервис рекомендуется использовать для получения данных в рамках какого-то среза ограничивающего возможный объем данных: по ограниченному набору отелей, на ближайшие даты, по нескольким странам и т.п.

Особенности работы

  • максимально быстрая скорость получения результата
  • ответ на запрос формируется сразу полностью
  • минимальная цена точная (та которая в текущий момент минимальна в нашей БД по данным параметрам)
  • по непопулярным запросам можно получить данных меньше чем в комбинированном поиске, если они в текущий момент не присутствуют в нашей БД (принципы работы комбинированного поиска не позволяют использовать его для выгрузки данных)
  • ответы сервиса не кешируются

Ограничения

  • Количество данных возвращаемое одним запросом: не более 2500 туров.
  • Макс. допустимое количество запросов в сутки: не регламентировано (определяется индивидуально в случае создания клиентом высокой нагрузки на сервис).


Организация поиска на своем сайте (тип поиска: комбинированный)

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


Сервис предоставляет данные полученные в текущий момент из всех возможных источников: сохраненные в БД, полученные "на лету" из системы туроператора, а также некоторыми другими способами.


Обратите внимание: данный тип поиска для обработки запросов от конечных пользователей, и не предназначен для обработки автоматических запросов. Ограничение вызвано тем что запросы в конечном счете передаются в системы туроператоров, которые зачастую не адаптированы к большой нагрузке. Для автоматических запросов должен использоваться тип поиска БД поиск.

Алгоритм организации поиска

  1. Приложение формирует поисковый запрос и отправляет его сервису Поиск туров.
  2. Сервис инициирует новый поиск.
  3. Приложение ожидает ответа от сервиса.
  4. Сервис возвращает данные по запрошенной странице, данные о количестве найденных туров и ключ поиска.
  5. Сервис в фоновом режиме продолжает поиск до нахождения всех данных для запроса.
  6. Приложение периодически опрашивает сервис Статус поиска, для обновления найденного количества туров и проверки что поиск не завершен.
  7. Получив информацию что поиск завершен приложение может:
    • сообщить пользователю что поиск завершен
    • предложить обновить результаты поиска (т.к. могли быть найдены новые данные)
    • обновить результаты поиска автоматически
  8. Для обновления результатов поиска приложение отправляет сервису Поиск туров поисковый запрос, идентичный тому что был отправлен ранее.


Особенности работы

Время поиска
  • Т.к. в момент поиска приходится ждать ответа из разных систем, полный поиск может занимать продолжительное время.
  • Ограничение на время полного поиска 30 сек., после этого в результаты поиска попадают туры найденные за это время.
  • Приложение должно запрашивать у сервиса нужную ему страницу данных. Страница определяется параметрами dataLimit, dataOffset.
  • После запроса сервис возвращает данные в момент когда:
    • либо найдено достаточное количество данных для формирования запрошенной страницы
    • либо истек таймаут
  • Таймаут на возврат запрошенной страницы 10 сек. По истечении таймаута сервис вернет все найденные на этот момент предложения.
  • Таймаут может быть автоматически увеличен до 30 сек, если за это время ни одного предложения не найдено, но все еще ожидается ответ от медленного поставщика данных.
Минимальная цена
  • При возврате запрошенной страницы первым туром будет тур с минимальной ценой из всех найденных в текущий момент.
  • Если на момент возврата страницы таймаут еще не истек, это тур с минимальной ценой по данному запросу.
  • Если страница возвращена из-за таймаута, то потенциально в процессе поиска могут быть найдены туры с ценой меньше. Они будут доступны по данному запросу после окончания поиска.
Кеширование
  • Все запросы



Поиск
  • В случае если поиск с заданными параметрами уже происходит в текущий момент, сервис будет использовать его результаты. Если данные для запрашиваемой страницы уже получены, она будет возвращена сразу. Если нет, сервис подождет пока поступит необходимое количество данных.
  • В случае если поиск с заданными параметрами уже завершен, сервис сразу вернет результат из кеша поиска.
  • На данный момент время жизни кеша 15 минут.


Особенности работы

  • максимально быстрая скорость получения результата
  • ответ на запрос формируется сразу полностью
  • минимальная цена точная (та которая в текущий момент минимальна в нашей БД по данным параметрам)
  • по непопулярным запросам можно получить данных меньше чем в комбинированном поиске, если они в текущий момент не присутствуют в нашей БД (принципы работы комбинированного поиска не позволяют использовать его для выгрузки данных)

Ограничения

  • Количество данных возвращаемое одним запросом: не более 2500 туров.
  • Макс. допустимое количество запросов в сутки: не регламентировано (определяется индивидуально в случае создания клиентом высокой нагрузки на сервис).

Сервис Поиск туров

Работа с сервисом осуществляется путем отправки POST запросов на адрес http://tourclient.ru/f/exml/ИДЕНТИФИКАТОР_ПОЛЬЗОВАТЕЛЯ/tours_export .

Параметр request должен содержать xml запроса.

В результате сервис вернет ответ в формате xml.

Запрос к сервису

<?xml version="1.0" encoding="UTF-8"?>
<TourSearchRequest>
    <dataOffset>0</dataOffset>
    <dataLimit>50</dataLimit>
 
    <seatStatus>3</seatStatus>
 
    <cityId>1000</cityId>
    <countryId>12</countryId>
    <roomSizeId>14</roomSizeId>
 
    <adults>2</adults>
    <children>0</children>
 
    <childAge1>0</childAge1>
    <childAge2>0</childAge2>
 
    <durationFrom>7</durationFrom>
    <durationTill>14</durationTill>
 
    <departureFrom>2014-07-25</departureFrom>
    <departureTill>2014-08-10</departureTill>
 
    <ticket>1</ticket>
 
    <priceFrom>500</priceFrom>
    <priceTill>50000</priceTill>
    <currency>3</currency>
 
    <operatorIds>
        <id>111</id>
        <id>222</id>
        <id>333</id>
    </operatorIds>
 
    <resortIds>
        <id>111</id>
        <id>222</id>
        <id>333</id>
    </resortIds>
 
    <resortPlaceIds>
        <id>111</id>
        <id>222</id>
        <id>333</id>
    </resortPlaceIds>
 
    <allocCatId>7</allocCatId>
    <allocRate>3.56</allocRate>
 
    <allocationIds>
        <id>111</id>
        <id>222</id>
        <id>333</id>
    </allocationIds>
 
    <mealIds>
        <id>111</id>
        <id>222</id>
        <id>333</id>
    </mealIds>
 
    <roomViewIds>
        <id>111</id>
        <id>222</id>
        <id>333</id>
    </roomViewIds>
 
    <roomTypeIds>
        <id>111</id>
        <id>222</id>
        <id>333</id>
    </roomTypeIds>
 
</TourSearchRequest>
<TourExtraEntities>
    <entity>OnlineSeatsState</entity>
    <entity>ExtraCharges</entity>
    <entity>City</entity>
    <entity>Country</entity>
    <entity>RoomSize</entity>
    <entity>Resort</entity>
    <entity>ResortPlace</entity>
    <entity>Allocation</entity>
    <entity>AllocCat</entity>
    <entity>Meal</entity>
    <entity>RoomType</entity>
    <entity>RoomView</entity>
    <entity>Operator</entity>
</TourExtraEntities>

Ответ сервиса

Сервис возвращает ответ, содержащий массив объектов Тур (Tours) и объект Статус поиска (SearchStatus)

<?xml version="1.0" encoding="UTF-8"?>
<Result>
    <Tours>
        <Tour>...</Tour>
        <Tour>...</Tour>
        <Tour>...</Tour>
        ...
    </Tours>
    <SearchStatus>
       ...
    </SearchStatus>
</Result>


Сервис Статус поиска

Работа с сервисом осуществляется путем отправки POST запросов на адрес http://tourclient.ru/f/exml/ИДЕНТИФИКАТОР_ПОЛЬЗОВАТЕЛЯ/tours_export .

Параметр request должен содержать xml запроса.

В результате сервис вернет ответ в формате xml.


Запрос к сервису

<?xml version="1.0" encoding="UTF-8"?>
<SearchStatusRequest>
    <key>df1b446a09606710d301153157fc862b</key> <!-- Уникальный ключ поискового запроса. -->
</SearchStatusRequest>

Ответ сервиса

Сервис возвращает ответ объект Статус поиска (SearchStatus)

Сервис возвращает ответ, содержащий массив объектов Тур (Tours) и объект Статус поиска (SearchStatus)

<?xml version="1.0" encoding="UTF-8"?>
<Result>
    <SearchStatus>
       ...
    </SearchStatus>
</Result>


Описание объектов

Объект Статус поиска

<SearchStatus>
    <key>df1b446a09606710d301153157fc862b</key> <!-- Уникальный ключ поискового запроса. -->
    <inProgress>true</inProgress>  <!-- Параметр показывающий завершен ли поиск. -->
    <toursCount>450</toursCount>   <!-- Количество найденных (на момент получения статуса) туров в рамках данного поискового запроса. -->
    <exactCount>false</exactCount> <!-- Параметр показывающий что количество найденных туров окончательное, и при изменении параметров offset и limit изменяться не будет. -->
</SearchStatus>

Объект Тур

<Tour>
    <id>3145968261@511</id>           <!-- Уникальный идентификатор тура. -->
    <operatorId>308</operatorId>      <!-- Идентификатор туроператора. -->
 
    <cityId>1000</cityId>             <!-- Идентификатор города вылета. -->
    <countryId>12</countryId>         <!-- Идентификатор страны прилета. -->
    <roomSizeId>14</roomSizeId>       <!-- Идентификатор размещения (DBL,SNGL,TRL...). -->
 
    <departure>2014-07-10</departure>   <!-- Дата вылета. -->
    <arrival>2014-07-17</arrival>       <!-- Дата прилета. -->
    <duration>7</duration>              <!-- Продолжительность (количество ночей в отеле). -->
    <ticket>1</ticket>                  <!-- Дата прилета. -->
                                        <!-- 0 - без билета, 1 - авиаперелет, 2 - поезд, 3 - автобус, 4 - паром, 5 - автомобиль -->
    <directFlight>false</directFlight>  <!-- Прямой перелет. true - известно что перелет прямой. -->
                                        <!-- false - известно что перелет с пересадкой. Если не опеределен, то не известно. -->
 
    <price>18000</price>                <!-- Стоимость тура в валюте запроса. -->
    <currency>2</currency>              <!-- Идентификатор валюты запроса. -->
    <priceIsApprox>true</priceIsApprox> <!-- Параметр показывает что цена была пересчитана по кросс-курсу и может содержать погрешность пересчета -->
                                        <!-- (возникает в случаях когда валюта запроса отлична от валюты предложения и оператор не имеет кросскурса для пересчета). -->
 
    <priceOrig>500</priceOrig>          <!-- Стоимость тура в валюте туроператора. -->
    <currencyOrig>1</currencyOrig>      <!-- Стоимость тура в валюты туроператора. -->
                                        <!-- 1 - USD, 2 - EUR, 3 - RUB, 4 - UAH -->
 
    <prevPriceOrig>0</prevPriceOrig>    <!-- Предыдущая стоимость тура (в валюте туроператора). -->
    <priceDiffPercent>0</priceDiffPercent>  <!-- Стоимость тура в валюте запроса. -->
                                        <!-- 1 - USD, 2 - EUR, 3 - RUB, 4 - UAH -->
 
    <ch1From>0</ch1From>                <!-- Возраст 1-го ребенка ОТ (для размещений с детьми) -->
    <ch1Till>0</ch1Till>                <!-- Возраст 1-го ребенка ДО (для размещений с детьми) -->
    <ch2From>0</ch2From>                <!-- Возраст 2-го ребенка ОТ (для размещений с детьми) -->
    <ch2Till>0</ch2Till>                <!-- Возраст 2-го ребенка До (для размещений с детьми) -->
 
    <resortId>4</resortId>              <!-- Идентификатор курорта -->
    <resortPlaceId>2392</resortPlaceId> <!-- Идентификатор района -->
    <allocationId>12395</allocationId>  <!-- Идентификатор отеля -->
    <allocCatId>7</allocCatId>          <!-- Идентификатор категории отеля -->
    <mealId>2</mealId>                  <!-- Идентификатор питания -->
    <roomTypeId>4</roomTypeId>          <!-- Идентификатор типа номера -->
    <roomViewId>22</roomViewId>         <!-- Идентификатор вида из номера -->
 
    <isStop>false</isStop>                      <!-- Параметр показывающий что тур в стопе -->
    <isStopAllocation>false</isStopAllocation>  <!-- Параметр показывающий что тур в т.к. нет мест в отеле -->
    <isStopFlight>false</isStopFlight>          <!-- Параметр показывающий что тур в стопе т.к. нет мест на рейсы -->
 
    <!-- Дополнительные объекты, описывающие параметры тура. Присутствуют объекте тур опционарно, в зависимости от параметров входящего запроса -->
    <OnlineSeatsState>...</OnlineSeatsState>
 
    <ExtraCharges>...</ExtraCharges>
 
    <City>...</City>
 
    <Country>...</Country>
 
    <Operator>...</Operator>
 
    <RoomSize>...</RoomSize>
 
    <Resort>...</Resort>
 
    <ResortPlace>...</ResortPlace>
 
    <Allocation>...</Allocation>
 
    <AllocCat>...</AllocCat>
 
    <Meal>...</Meal>
 
    <RoomType>...</RoomType>
 
    <RoomView>...</RoomView>
 
</Tour>

Дополнительные объекты для объекта Тур

Наличие мест

<OnlineSeatsState>
    <allocation>1</allocation>
    <flightThereEco>1</flightThereEco>
    <flightBackEco>1</flightBackEco>
    <flightThereBus>2</flightThereBus>
    <flightBackBus>2</flightBackBus>
    <isStopFlight>false</isStopFlight>
    <isStopAllocation>false</isStopAllocation>
</OnlineSeatsState>

Доплаты

<ExtraCharges>
    <visa>
        <min>25</min>
        <max>25</max>
        <currency>1</currency>
    </visa>
    <feeFuel>
        <min>0</min>
        <max>40</max>
        <currency>1</currency>
    </feeFuel>
</ExtraCharges>

Город вылета

<City>
    <id>1000</id>
    <name>Москва</name>
</City>

Страна

<Country>
    <id>12</id>
    <name>Египет</name>
</Country>

Туроператор

<Operator>
    <id>308</id>
    <name>Troyka</name>
</Operator>

Размещение

<RoomSize>
    <id>14</id>
    <name>DBL</name>
    <description>2-е взрослых</description>
    <adults>2</adults>
    <children>0</children>
</RoomSize>

Курорт

<Resort>
    <id>4</id>
    <name>Хургада</name>
</Resort>

Район (курорта)

<ResortPlace>
    <id>2392</id>
    <name>Эль-Дахар</name>
</ResortPlace>

Отель

<Allocation>
    <id>12395</id>
    <name>Sea View</name>
    <rate>2.5</rate>
</Allocation>

Категория отеля

<AllocCat>
    <id>7</id>
    <name>2*</name>
</AllocCat>

Питание

<Meal>
    <id>1</id>
    <name>AI</name>
    <description>питание+напитки местного производства</description>
</Meal>

Тип номера

<RoomType>
    <id>13</id>
    <name>Executive</name>
    <description>улучш. номер "Executive"</description>
</RoomType>

Вид из номера

<RoomView>
    <id>22</id>
    <name>ROH</name>
    <description>без опред. вида из номера</description>
</RoomView>