tech-tips/Программное обеспечение/SphinxSearch/Как исправить ошибки при работе с Sphinx 3.0.3 (с самого начала).md

9.7 KiB
Raw Permalink Blame History

source
https://axenov.dev/как-исправить-ошибки-при-работе-с-sphinx-3-0-3-с/

Установка

Качаем бинарники под свою ОСь

Распечатываем из архива содержимое папки /bin/ в /usr/bin/ (с повышенными правами)

Готовим структуру файлов и папок для хранения твоих настроек, индексов и логов #sphinx:

/home/user/sphinxdata/ # или любая удобная директория
|- binlogs/
|- indexes/
|- logs/ 
|  |- searchd.log # пустой файл
|  |- query.log # пустой файл
|  |- log.log # пустой файл
|- searchd.pid # пустой файл
|- sphinx.conf

Оформляем конфиг sphinx.conf. Образец лежит в скачанном тобой архиве в директории /etc/.

Запускаем индексацию

indexer --all --rotate -c ~/sphinxdata/sphinx.conf

Вывод команды в этот раз будет выглядеть примерно так:

using config file '/home/user/sphinxdata/sphinx.conf'...
indexing index 'index1'...
collected 43010 docs, 3.5 MB
sorted 0.3 Mhits, 100.0% done
total 43010 docs, 3.521 Mb
total 2.1 sec, 1.669 Mb/sec, 20383 docs/sec
indexing index 'index2'...
collected 91965 docs, 14.7 MB
sorted 1.4 Mhits, 100.0% done
total 91965 docs, 14.65 Mb
total 7.4 sec, 1.990 Mb/sec, 12494 docs/sec
WARNING: failed to open pid_file '/home/user/sphinxdata/searchd.pid'.
WARNING: indices NOT rotated.

Индексация прошла почти успешно. Почти — потому что последние две строки означают, что ротация не удалась, т.к. не запущен демон searchd. Это норма.

В файл searchd.pid будет записан идентификатор процесса демона. После успешной индексации утилита indexer считывает PID процесса searchd из этого файла и отправляет процессу сигнал, чтобы тот подцепил индекс. Поскольку мы ещё не запускали searchd и он сейчас не работает, то и PID-а там нет, и ротация логов не произошла, потому что слать сигнал нечему — о том и говорят последние две строки. Пожалуй, при первой индексации параметр --rotate можно даже не добавлять.

Вот теперь запускаем демона:

searchd -c ~/sphinxdata/sphinx.conf

При успешном запуске будет примерно такой вывод:

using config file '/home/user/sphinxdata/sphinx.conf'...
listening on all interfaces, port=9312
listening on all interfaces, port=9306
precaching index 'index1'
rotating index 'index1': success
precaching index 'index2'
rotating index 'index2': success
precached 2 indexes in 0.009 sec
WARNING: No extra index definitions found in data folder

Демон на свободе и работает. Можно тестировать поиск. Как? Не знаю. У меня перед настройкой sphinx, как правило, уже развёрнут рабочий проект, поэтому я просто прямо на сайте вбиваю поисковый запрос.

[!attention] Строки rorating будут видны только в том случае, если ты запускал индексацию при выключенном демоне. Когда он запустится индексы будут ротированы. Если ты просто запускаешь демона со старыми индексами, то будут строчки в духе precaching <...>: success. Если нет даже precaching, то читай дальше.

Траблшутинг

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

ПРОБЛЕМА: вывод команды indexer выглядит так:

using config file '/home/user/sphinxdata/sphinx.conf'...
indexing index 'index1'...
ERROR: index 'index1': sql_connect: Access denied for user 'mysqluser'@'localhost' (using password: YES) (DSN=mysql://mysqluser:***@localhost:3306/database).
total 0 docs, 0.0 Kb
total 0.0 sec, 0.0 Kb/sec, 0 docs/sec

ПРИЧИНА: указана не та БД, либо не те логин/пароль, либо пользователь не имеет прав на чтение таблиц БД. Короче, не удалось подключиться к БД.

РЕШЕНИЕ: верно указать все данные для подключения, проверить БД и права пользователя на чтение таблиц БД.


ПРОБЛЕМА: вывод команды indexer выглядит так:

using config file '/home/user/sphinxdata/sphinx.conf'...
indexing index 'index1'...
ERROR: index 'index1': sql_connect: failed to load libmysqlclient (or libmariadb) (DSN=mysql://mysqluser:***@localhost:3306/database).
total 0 docs, 0.0 Kb
total 0.0 sec, 0.0 Kb/sec, 0 docs/sec

ПРИЧИНА: не установлена (не найдена) библиотека libmysqlclient.so либо libmariadb.so

РЕШЕНИЯ:

https://toster.ru/answer?answer_id=1238929#answers_list_answer

https://blog.csdn.net/wuzuyu365/article/details/80151083

Установить libmysqlclient-dev от имени рута:

apt-get install libmysqlclient-dev \#debian
yum install libmysqlclient-dev \#centos

ПРОБЛЕМА: при запуске searchd возникает ошибка:

FATAL: failed to parse config file '/home/user/sphinxdata/sphinx.conf'

ПРИЧИНА: некорректный путь или имя файла конфига, который ты ему дал (параметр -c), либо ошибка в конфиге (в этом случае будет указано место ошибки в файле)

РЕШЕНИЕ: исправить путь к конфигу и ошибки в нём


ПРОБЛЕМА: вывод команды searchd выглядит так (нет ни строчек rotating, ни precaching):

WARNING: both 'sphinxdata' and config file '/home/user/sphinxdata/sphinx.conf' exist; using 'sphinxdata' folder
no config file, using 'sphinxdata' folder...
listening on all interfaces, port=9312
listening on all interfaces, port=9306
WARNING: No extra index definitions found in data folder

ПРИЧИНА: демон запущен, но конфиг не прочтён и индексы не подцепились. Почему тут оно так происходит мне в деталях неизвестно.

РЕШЕНИЕ: выполнить команды по порядку:

searchd --stop # завершаем демона цивилизованно, результат не важен
killall searchd # убиваем всё цивилизованно не завершённое, результат не важен
rm -f ~/sphinxdata/sphinx.state* # мешают файлы sphinx.state и sphinx.state.new
searchd -c ~/sphinxdata/sphinx.conf # запускаем заново и всё будет заебись

ПРИМЕЧАНИЕ: Вообще, директория sphinxdata всегда создаётся в текущей рабочей директории при запуске демона searchd (там, где вы находитесь в момент запуска).

Говорят, что нужно просто удалять папку sphinxdata перед каждым запуском если она создаётся, либо после запуска, если создалась. Якобы, тогда всё заработает.

Этот совет может сработать (а может и не сработать) для тех, кто уже ставил сфинкса, имеет свои старые конфиги, обновил сфинкса до версии 3.* и пытается ему эти конфиги скормить. Но в любом случае, имейте в виду такое поведение сфинкса.

В рассматриваемом нами случае, мы пошли другим путём и наоборот стали использовать именно эту папку для наших конфигов и дел. Удалять нам её незачем в контексте данной статьи. Мы запускаем searchd где попало (грешновато), но всегда явно суём ему конкретный конфиг (параметр -c).


ПРОБЛЕМА: поиск всё ещё не работает

ПРИЧИНА: ты

РЕШЕНИЕ: проверить конфиг(и), запустить индексацию, перезапустить демона, следить за каждым WARNINGом, логами, ошибками, гуглить и искать решение, которое тут не описано.