Есть Яндекс.Сервер настроенный на индексацию mysql.
В качестве данных ему скармливаются строки:
1 — «007 бегемот»
2 — «007bb бегемот»
В результате, в качестве результата поиска по запросу «007» Яндекс.Сервер находит только документ 1.
По запросу «007bb» только документ 2, соответственно.
Можно ли настроить так, чтобы находил оба результата в обоих случаях и еще бы ранжировал?
Второй вопрос:
При индексации указываю некий булевый атрибут, например «stock».
Потом, при попытке поискать «бегемот stock:1» можно заметить что ранжирование результатов будет отличаться от просто «бегемот», даже при том, что stock==1 у всех документов.
Можно ли настроить так, чтобы атрибуты не учитывались при ранжировании?
Третий вопрос:
Мне бы хотелось указывать некий атрибут, скажем объем продаж товара и учитывать его вес при ранжировании.
В настойках поискового модуля есть директива UserRelevanceLibrary, позволяющая указать библиотеку, в которой определена функция, позволящая выполнять произвольное ранжирование результатов поиска. Но не хотелось бы связываться с C++.
Можно ли настроить поиск с учетом веса атрибута без возни с C++?
Четвертый вопрос:
У меня есть список категорий в которых находится товар (может быть сразу в нескольких), например: «12, 255, 135».
Я бы хотел, чтобы в результате некого запроса выдавались только товары, принадлежащие категории 255.
Можно ли реализовать это средствами Яндекс.Сервер, или мне необходимо производить постобработку его результатов?
Ох, замучаетесь вы с ним! Если есть возможность индексировать базу или XML (вроде, вам поиск по товарам нужен), то удобнее использовать Sphinx. Там все это можно.
Вообще, их некорректно сравнивать. Яндекс обходит сайт и индексирует html. Sphinx индексирует не страницы, а данные (может брать их из базы данных или из XML-pipe). То есть, подход совсем разный. Если нужно организовать поиск по данным, которые легко представить в виде результата выполнения SELECT из базы, тогда Sphinx удобнее. Если же с данными нужно проделать что-то сложное при отображении или данные вообще не локализованы и нужен поиск именно по содержимому страниц сайта, то Sphinx тут не поможет.
Для вас главный недостаток Sphinx в том, что его нужно ставить и настраивать, а Яндекс-сервер, видимо, уже как-то работает :-)
1 — Яндекс.Сервер может индексировать данные из БД.
2 — То как у меня работает, Яндекс.Сервер трудно назвать пригодным.
Мне кажется, вы неверно представляете себе Яндекс.Сервер или у вас устаревшие знания — api.yandex.ru/server/, это не сервис Яндекса, отдающий xml, это — программный продукт.
Яндекс-сервер я хорошо представляю, но, действительно, устаревшую версию. Теперь не знаю, за что зацепиться. Интуитивно я понимаю, что от появления MySQL-модуля Яндекс-сервер лучше не стал. Он сложный и медленный. Вот тут что-то пишут: habrahabr.ru/qa/1079/
Задача: поиск по товарам, при этом пользователи могут вводить дополнительные уточнения: искать только в определенной категории и ее детях и/или искать только товары, которые есть в наличии.
Важно учитывать, что по запросу «007», товары с артикулами «007bb» и «007aa» должны находиться.
Пара-тройка десятков тысяч + отдельно таблица свойств + отдельно таблица дополнительных категорий (помимо основной категории, которая записывается в основную таблицу products).
Обновлять можно нечасто, пару раз в неделю. С другой стороны, могу запускать переиндексацию каждую ночь.
По факту, данные о наличии товара обновляются каждые 10 минут, поэтому так или иначе придется производить постобработку результатов поиска, чтобы не переиндексировать базу каждые 10 минут.
Основное требование не скорость индексации, это практически неважно, Яндекс.Сервер тратит на это порядка 1-2 минут. Главное — это гибкость выдачи результатов (в зависимости от дополнительных параметров запроса) и вообще способность выдавать нужные результаты (см. первый вопрос)
Про яндекс уже не знаю, но для сфинкса это совершенно нормальная задача. Если запрос на выборку одного документа получится достаточно быстрый, то индексация 50000 будет занимать несколько десятков секунд, а то и меньше. Кроме того, можно настроит индексирование только обновленных данных (хоть каждую минуту).
Плюс, у сфинкса есть русский форум, где можно задавать вопросы разработчику и сообществу.
По вашим предыдущим вопросам и их совместимостью со сфинксом:
1. Я бы сделал в базе поле art_search, где лежал бы артикул, очищенный от лишних символов. Сфинкс может искать хоть по однобуквенным словам (в указанном индексе) и без морфологии, где она не нужна.
2. Можно. Там, наоборот, нужно будет указать вес полей, которые нужно учитывать. Ну или еще как-то — там разные алгоритмы ранжирования. Собственно, правильная настройка ранжирования — это и есть самый сложный момент.
3. Без проблем, через API.
4. Без проблем. Если это число, то через sql_attr_uint.
Дело в том, что «007» и «007bb» — это корректные артикулы. Просто «007», скажем, артикул товара без окраски, а «007bb» — модификация, уже окрашенный товар. Но необходимо находить «007bb» при поиске «077», как если бы это был просто поиск по вхождению. Sphinx можно так настроить?