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

178 lines
9.7 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
source: https://axenov.dev/как-исправить-ошибки-при-работе-с-sphinx-3-0-3-с/
---
## Установка
[Качаем бинарники](http://sphinxsearch.com/downloads/current/) под свою ОСь
Распечатываем из архива содержимое папки `/bin/` в `/usr/bin/` (с повышенными правами)
Готовим структуру файлов и папок для хранения твоих настроек, индексов и логов #sphinx:
```
/home/user/sphinxdata/ # или любая удобная директория
|- binlogs/
|- indexes/
|- logs/ 
| |- searchd.log # пустой файл
| |- query.log # пустой файл
| |- log.log # пустой файл
|- searchd.pid # пустой файл
|- sphinx.conf
```
Оформляем конфиг `sphinx.conf`. Образец лежит в скачанном тобой архиве в директории `/etc/`.
Запускаем индексацию
```shell
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` можно даже не добавлять.
Вот теперь запускаем демона:
```shell
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](http://libmysqlclient.so/) либо [libmariadb.so](http://libmariadb.so/)
**РЕШЕНИЯ:**
[https://toster.ru/answer?answer_id=1238929#answers_list_answer](https://toster.ru/answer?answer_id=1238929#answers_list_answer)
[https://blog.csdn.net/wuzuyu365/article/details/80151083](https://blog.csdn.net/wuzuyu365/article/details/80151083)
Установить `libmysqlclient-dev` от имени рута:
```shell
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
```
**ПРИЧИНА:** демон запущен, но конфиг не прочтён и индексы не подцепились. Почему тут оно так происходит мне в деталях неизвестно.
**РЕШЕНИЕ:** выполнить команды по порядку:
```shell
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ом, логами, ошибками, гуглить и искать решение, которое тут не описано.