Найдите исполнителя для вашего проекта прямо сейчас!
Разместите заказ на фриланс-бирже и предложения поступят уже через несколько минут.

Необходимо написать php класс FoodSearch (в виде composer package) реализующий функционал различных видов поиска по продуктам/рецептам.

Разработку выполнять в git репозитарии https://github.com/YadrovSergey/FoodSearch

Также в этот репозитарий положить конфиг настроек sphinx (его необходимо обсудить совместно).

Используем: Sphinx 2.1, SphinxQL, RT index.

Разработку и тестирование производить на виртуальной машине «1C-Битрикс: Виртуальная машина 5.1» ( http://www.1c-bitrix.ru/download/vmbitrix.php )!

На ней установлен php, Sphinx. Т.е. все, что нужно для реализации данной задачи. Скачать ее можно здесь http://repos.1c-bitrix.ru/vm/VMBitrix5.1.2-vmware.zip

Поиск будет осуществляться по двум базам продуктов:

1. Общая база продуктов и рецептов. id_source = 0

2. База продуктов и рецептов пользователей. id_source = 1

Тестовые данные будут предоставлены. Общая база порядка 7000 наименований, база пользователей – 300 000 (она постояно растет).

При необходимости формат тестовых данных может быть изменен, для целей удобства реализации функций поиска.

Функции заполнения Sphinx данными.

->addFood($nIdSource, $arFields) – добавляет в заданную базу продукт. Если продукт уже существует в базе, то будет обновлен.

$nIdSource – в какую базу будет добавляться продукт. 0 – Общая база, 1 – база пользователей.

$arFields – ассоциативный массив полей для добавления в поиск.

Пример полей можно увидеть в файлах с тестовыми данными.

->deleteFood($nIdSource, $nId) – удаляет продукт из соответствующей базы.

->loadFromFile($nIdSource, $sPathToFile) – заполняет Sphinx тестовыми данными из предоставленных файлов. Будет использоваться в основном для тестирование поиска.

Общие замечания

Все функции должны быть chainable.

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

Например, $foodSearch->filterSource(0)->filterTypeOfFo od(0)->limit(50)->search("яблоко")

Формат результата поиска – ассоциативный массив.

array(

array(* все поля данных),

...

);

Функции установки фильтра.

->filterAccount($nIdAccount) – устанавливает фильтр по полю "id_account"

->limit($nRowCount, $nOffset = 0) – устанавливаем лимит выборки.

->filterSource($nIdSource) – устанавливает индекс, по которому будет осуществляться поиск. 0 – Общая база, 1 – база пользователей. Если не установлен, то поиск будет идти по общей базе и базе пользователей. Данная функция влияет на From.

->filterPublished($nIsPubleshed) – фильтр по полю is_published.

->filterGroupId($GroupId) – фильтр по полю group_id. Может быть задан в виде массива.

->filterGroupName($GroupName) – фильтр по полю group. Может быть задан в виде массива.

->filterNutrients($arNutrients) – фильтр по полю nutrients. Где nutrients содержит JSON данные.

$arNutrients- это ассоциативный массив, который содержит ids nutrients для фильтрации.

Например:

array(

"1"=> array("from"=>100)

"4"=> array("to"=>100)

"5"=> array("from"=>1, "to"=>200)

);

В итоге будет фильтр: ingredients.1 > 100 and ingredients.4 filterSourceOfComposition($nSourceOfCompos ition) – фильтр по полю source_of_composition. Может быть задан в виде массива.

->filterTypeOfFood($nTypeOfFood) – фильтр по полю type_of_food.

Функции группировки.

->groupByGroupName() – группировка по полю group.

->groupByGroupId() – группировка по полю group_id.

Вопрос. Можно ли дополнительно сортировать группы в результате?

Функции сортировки.

->sortBy($sColName, $SortType="DESC") – устанавливаем сортировку по полю. Может быть вызвана несколько раз, в этом случае будет сортировка будет по нескольким полям.

Функции поиска.

->search($sQuery = "") – поиск продуктов по строке.

$sQuery – строка поиска. Может быть вида "Яблоко", "Яблоко салат", "Ябл".

Поиск осуществляется по полю "name".

Поиск с учетом морфологии. Например, "Яблоко" должно найти "Яблоки".

Может быть задано слово не полностью, а только его начало. Минимально 3 символа. Например, "ябл", "карто"

Чем ближе искомая фраза к началу, тем выше результат в поиске. Например, есть "Яблоки салат" и "салат из яблок". Выше должна быть первая строка.

На результат поиска не должно влиять количество вхождений искомой фразы в поле "name".

Если $sQuery задано в виде пустой строки, то значит мы хотим найти все продукты удовлетворяющие заданным фильтрам.

Например, $foodSearch->filterSource(0)->filterTypeOfFo od(0)->limit(50)->search("яблоко") ,

$foodSearch->filterNutrients(array("1" => array("from"=>100)))->limit(50)-> search()

->searchInIngredients($arIngredients) – поиск рецептов по ингредиентам. Т.е. ищем рецепты, в составе которых есть заданные ингредиенты

$arIngredients – массив ингредиентов, который должен содержать рецепт. Например, array("яблоки", "огурец")

Поиск осуществляется по полю "ingredients".

Поиск с учетом морфологии.

Например, $foodSearch->filterTypeOfFood(1)->sortBy(" rating","DESC")->limit(50)-> filterPublished(1)->searchInIngredients(array ("яблоки", "огурец"))

9 лет назад
Belyi92
Игорь 
32 годаБеларусь
11 лет в сервисе
Был
9 лет назад
4 отзыва
  • Похожие заказы
  • Здравствуйте. У нас 4 сайта. Планируются ещё 2. Нам нужен ответственный и надёжный программист на постоянную работу. Первые задания будут по блогу на вордпресс. Нужно сделать мониторинг на блоге по типу http://www.davidnews.com/p/rcb.html исправлять глюки и ...

    Закрыт
    9 лет назад
  • Добавил дополнительную запись TXT для активации SSL сертификата , после чего сайт перестал работать, изменял записи в CDN CloudFair. После удалил новую запись и сайт через полдня начал открываться, но только первая страница. До этого, ...

    Закрыт
    9 лет назад
  • Требуется создать аналог wifi-4-like.ru Принцип работы: Гость подключается к бесплатной точки доступа Для доступа выбирает социальную сеть На странице гостя в соц. сети размещается рекламный пост или же он подписывается на группу ...

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

    Закрыт
    9 лет назад
  • Скрипт должен парсить список освобождающихся доменов https://www.reg.ru/domain/new/rereg И дальше залезать по каждому домену на archive.org и проверять наличие и год самой ранней существующей копии сайта. И выдавать какие были найдены, те что есть в архиве и полученный ...

    Закрыт
    9 лет назад
  • $10

    Только для тех, кто умеет эффективно оптимизировать и хорошо знаком с данной темой. Дано: Вордпресс c темой, по анализу видно какие скрипты и файлы замедляют рендеринг, нужно их оптимизировать. Каким способом - ваша задача. Новичкам просьба ...

    Закрыт
    9 лет назад
  • в готовый магазин на платформе XT-Commerce требуется интегрировать модуль оплаты BitCoin (https://blockchain.info/ru/api/api_receive). Завершение заказа должно происходить только, если ответ API подтвердил поступление денег!

    Закрыт
    9 лет назад
  • Здравствуйте. Необходимо сделать модуль оплаты закрытой информации на сайте, после оплаты закрытая информация автоматически открывается, плюс ряд дополнений к имеющемуся функционалу (подробнее в прикрепленном файле). В кратком ТЗ описан весь ...

    Закрыт
    9 лет назад