Информации по Sphinx не так много, как хотелось бы. Лишняя статья не помешает.
Первые шаги в освоении Sphinx мне помогли сделать статьи Создание ознакомительного поискового движка на Sphinx + php и Пример Sphinx поиска на реальном проекте — магазин автозапчастей Tecdoc Советую начать с них. Некоторое время на моем сайте работал поиск через LIKE по каждому слову запроса. Хотелось большего, и вот какие случаи теперь будут обрабатываться правильно: Выдача сначала должна содержать позиции в наличии, потом временно отсутствующие, потом архивные. И все эти три группы должны быть отсортированы по релевантности. Для этого надо задать атрибуты. В моем случае это поля clearance и in_stock раздела source sphinx.conf Эти поля будут использованы в формировании выдачи в PHP. Опишу ниже. morphology = stem_enru
Морфология решает мою первою задачу. Поиск 'подшипники', 'подшипника', 'подшипников' приведет к единому результату. Стэммы (stem_enru) быстрее, леммы (lemmatize_ru) точнее. Я пробовал только стэммы. Выбор повлияет на ваш словарь замен wordforms. Захотите поменять — придется переписывать. min_word_len = 1
Индексируем слова любой длины.  html_strip = 1
Удаляем html тэги min_infix_len = 1
Поиск будет по фрагменту слова. Проиндексируем фрагменты вплоть до 1 буквы. Так как база у меня менее 10000 наименований, то на индексе не экономлю. expand_keywords = 1
Автоматически приводит запрос к виду "( running | running | =running )". min_infix_len и expand_keywords приведут, к тому что запрос RV 2205 выдаст RV2205. Кстати, тире – это разделитель эквивалентный пробелу. Так что RV-2205 то же выдаст RV2205. charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F, U+401->U+0435, U+451->U+0435
Приводим латиницу и кириллицу в нижний регистр. Ё заменяем на е. blend_chars = +, &, U+2C, U+2E
У меня много нецелых чисел. Их надо индексировать полностью. U+2C и U+2E это точка и запятая. Например, 1.25 будет индексирован как '1.25', '1' и '25'.  regexp_filter = (\d+)\,(\d+) => \1.\2
Десятичные знаки в числах могут быть разделены точками и запятыми: "1,75", "1.75". Приведем все к точке Синонимы и опечатки Единицы измерения можно писать по русски или английски: мм-mm, мАч-mAh, мВт-mW. Добавляем в словарь синонимов, путь к которому указан в wordforms: "мач > mah". Язык для индекса выбираю по собственным предпочтениям. Знак ~ указывает применять замену после обработчика морфологии. Это позволяет не писать все словоформы и вместо правил для 'корка', 'корку', 'корки' написать "~корк > кузов" Мой список полностью: Прилипание букв к цифрам Иногда числа это часть названия (например LCD5208D), но чаще характеристика (100mAh, 10x15x4мм). Отделяем все числа от букв и индексируем.  Это решит несколько задач: Прежде чем написать регулярное выражение для отделения чисел, нужно унифицировать разделители. Важно помнить, что регулярные выражения выполняются все и последовательно. Уберем икс, хэ и звезду в размерах типа 10х15х4 M3x10: Отбросим хвосты: И головы: Отбросим "мм", так как они часто не указаны в названии товара.
Сделаем файл stop.txt и пропишем его в stopwords.
Содержимое: Sphinxapi рано или поздно будет depricated. Будем использовать Sphinxql. Для этого надо подключиться к БД. В моем случае Sphinx подключаемого через хостинг это выглядит так: А все общение со Spinxql это один SELECT передающий отфильтрованный текст запроса SphinxQL не понимает выражения в разделе сортировки ORDER BY, поэтому WEIGHT() и in_stock>0 пришлось поместить в поля. Кстати, LIMIT по умолчанию всего 20. Сортировка сначала выдаст позиции в наличии, потом временно отсутствующие, потом архивные. И все эти три группы будут отсортированы по релевантности (весу). Через field_weights задаем какие поля будут обладать большим весом. Выполнив запрос, мы получим отсортированный массив id. Но, к сожалению, отбор данных через WHERE id IN() эту сортировку нарушит. Придется формировать свой запрос для каждого id. На этапе отладки сильно помогает запрос "SHOW META" сразу после запроса SELECT. Особенно для проверки словаря wordforms и регулярных выражений фильтров. Можно увидеть перечень ключевых слов, на которые разложился запрос. Мы продаем запчасти. Я решил добавить в индекс название категории товара и название модели, для которой предназначается запчасть. Но каждый товар может быть привязан сразу к нескольким категориям и подходить для нескольких моделей. И я открыл для себя функцию GROUP_CONCAT Она позволяет получить данные по группировке в строку. Например поле categories.name будет содержать все категории отобранного items_zip.id через пробел.