Информация! При написании статьи было использовано:
- Windows 7
- Denwer 3
- Sphinx 2.2.9
- MySql 5.5
Подразумеваем, что база данных уже создана. Если нет, то тестовую БД можете скачать здесь.
Скачайте актуальный релиз поисковой системы Sphinx с официального сайта: http://sphinxsearch.com/downloads/release/. На момент написания статьи последний релиз был Sphinx 2.2.9-release, я выбрал Win64 binaries w/MySQL+id64 support
Распакуйте архив в папку C:\Sphinx
. После разархивирования папка будет выглядеть следующим образом:
Далее необходимо создать внутри папки C:\Sphinx
еще 3 папки: data
, log
и dicts
:
Внутри папки log
создаем 3 файла: query.log
, searchd.log
и search.pid
:
Открываем командную строку Windows (консоль, Win + R и вводим cmd). Первое, что необходимо сделать - это установить службу Sphinx с помощью команд:
C:\Sphinx\bin\searchd --install --config C:\Sphinx\sphinx.conf.in --servicename SphinxSearch
где ключ servicename
определяет имя Вашей службы. После установки Вы увидите следующее сообщение в консоле:
Для удаления необходимо выполнить команду:
C:\sphinx\bin\searchd --servicename Sphinx --delete
Далее необходимо создать кешированные Sphinx-ом документы по которым он будет осуществлять поиск (индексы). Для создания индексов необходимо сконфигурировать файл настроек этой системы. Внутри релиза уже представлены два файла: один с полным описанием - sphinx.conf.in
, второй только с обязательными настройками sphinx-min.conf.in
.Сделаем резервную копию файла sphinx.conf.in
. Далее открываем его для редактирования, оставим, то что нужно, остальное удалим. Пример файла sphinx.conf.in
(файл должен состоять минимум из 4 секций):
# data source definition source mainConfSourse { type = mysql sql_host = localhost sql_user = root sql_pass = sql_db = test_sphinx sql_port = 3306 # optional, default is 3306 sql_query_pre = SET NAMES utf8 } # наследник 1 source testDocSrc : mainConfSourse { #пример запроса с джойном, обыйный SQL sql_query = SELECT documents.id AS id, documents.title AS title, documents.content AS content, \ tags.docid AS docid, tags.tagid AS tagid \ FROM documents \ LEFT JOIN tags ON(tags.docid = documents.id) \ WHERE documents.group_id=1; #здесь вы должны указать по каким полям будете группировать результаты, #лучше указать все которые были перечислены сверху, тогда выглядеть будет логично #type of group fields sql_field_string = id sql_field_string = title sql_field_string = content sql_field_string = docid sql_field_string = tagid } index testDocIndex { source = testDocSrc path = C:/Sphinx/data/testDoc/testDoc morphology = stem_enru min_word_len = 1 # dict = keywords # mlock = 0 # docinfo = extern # morphology = stem_en, stem_ru, soundex # morphology = libstemmer_german # morphology = libstemmer_sv # min_stemming_len = 1 # wordforms = C:/Sphinx/data/wordforms.txt # ngram_chars = U+3000..U+2FA1F # phrase_boundary = ., ?, !, U+2026 # horizontal ellipsis } # наследник 2 source testDoc2Src : mainConfSourse { sql_query = SELECT documents.id AS id, documents.title AS title, documents.content AS content \ FROM documents; #type of group fields sql_field_string = id sql_field_string = title sql_field_string = content } index testDoc2Index { source = testDoc2Src path = C:/Sphinx/data/testDoc2/testDoc2 morphology = stem_enru, Soundex, Metaphone min_word_len = 1 expand_keywords = 1 index_exact_words = 1 min_infix_len = 3 } ############################## indexer { mem_limit = 64M } searchd { listen = 127.0.0.1:9306:mysql41 pid_file = C:/Sphinx/log/searchd.pid log = C:/Sphinx/log/searchd.log query_log = C:/Sphinx/log/query.log #binlog_path = c:/sphinx/data/binlog/ mysql_version_string = 5.0.0 seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 }
Скачать этот файл конфигураций можно здесь.
Возвращаемся в консоль и вводим команду для создания индекса.
Внимание! Создание индексов.
Если служба Sphinx не запущена, то выполняем команду:
C:\Sphinx\bin\indexer --all --config C:\Sphinx\sphinx.conf.in
Если служба запущена, для перегрузки индексов используется команда с дополнительным ключом:
C:\Sphinx\bin\indexer --all --config C:\Sphinx\sphinx.conf.in --rotate
Сейчас будем использовать первую команду:
C:\Sphinx\bin\indexer --all --config C:\Sphinx\sphinx.conf.in
После успешного создания индексов в консоле Вы увидите примерно следующее:
Далее необходимо запустить службу SphinxSearch. Для этого открываем меню Пуск Панель управления Администрирование Службы SphinxSearch Запустить (Start Control Panel Administrative Tools Services SphinxSearch Start).
Идем далее, если Вы используете denwer, то в консоле введите команду перехода в mysql denwer (путь может отличаться):
d: d:/web/usr/local/mysql-5.5/bin/mysql -h 127.0.0.1 -P 9306
Для более корректного отображения кирилицы можно к команде дописать ключ устанавливающий кодировку по умолчанию, тогда команда примет вид:
d:/web/usr/local/mysql-5.5/bin/mysql -h 127.0.0.1 -P 9306 --default-character-set=utf8
После выполнения команды Вы увидите следующее:
Если у Вас установлен "чистый" MySql, то в консоле введите команду mysql
. Если MySql не добавлен в переменные среды windows, то пропишите полный путь к нему, по примеру denwer.
И так, мы зашли в консоль MySql и теперь проверим работу sphinx. Для этого выполним следующий запрос:
SELECT title FROM testDocIndex LIMIT 5;
Внимание! При написании SphinxQL запроса обращаться нужно не к таблице в вашей базе, а к индексу который Вы создали,
то есть по имени которое Вы указали после слова index в конфиг файле (sphinx.conf.in
), в нашем случае это testDocIndex
и testDoc2Index
Получим следующее:
Готово! Sphinx установлен и работает! Если при проверке кирилица в консоли выглядит "кривыми иероглифами" не волнуйтесь, дело в кодировке ОС, скорее всего на сайте будет все нормально.
Внимание!
- После любого изменения конфиг файла, в разделе searchd необходимо перезапустить службу SphinxSearch
- Если вносите изменения в разделах sourse, index то что бы изменения были видны, необходимо пересоздать индексы, команда пересоздающая индексы при работающей службе была написана здесь
- Язык SphinxQL хоть и похож на обычный SQL, тем не менее не обольщайтесь различий хватает
Информация! Вы можете скачать файлы используемые в сатье:
Комментарии
Нужна помощь!
ОтветитьУ меня консоль выдает ошибку:
using config file 'C:\Sphinx\sphinx.conf.in'...
ERROR: unkown key name 'FROM' in C:\Sphinx\sphinx.conf.in line 23 col 6.
FATAL: failed to parse config file 'C:\Sphinx\sphinx.conf.in'
После выполнения команды:
C:\Sphinx\bin\indexer --all --config C:\Sphinx\sphinx.conf.in
Вроде все делал по инструкции, при использовании тестового файла из примера все работает. Как только заменяю на свои настройки, то выдает ошибку. Что делать?
Покажите строку 23 из файла sphinx.conf.in
ОтветитьFROM pages \
Ответитьsql_query = SELECT pages.text AS text, pages.name AS name \
ОтветитьFROM pages \ #<- строка 23
WHERE pages.visibility=1;
Проверьте нет ли пробелов перед FORM или в конце предыдущей строки после \
ОтветитьЗаработало, действительно были лишние пробелы. Спасибо
Ответитьusing config file 'C:\Sphinx\sphinx.conf.in'...
Ответитьindexing index 't1PostsIndex'...
FATAL: failed to open C:/Sphinx/data/t1Posts/t1Posts.spl: No such file or directory, will not index. Try --rotate option.
После попытки создания индексов командой:
C:\Sphinx\bin\indexer --all --config C:\Sphinx\sphinx.conf.in
Подскажите в чем может быть проблема?
Создайте папку t1Posts в C:/Sphinx/data/
ОтветитьБудет ли продолжение статьи? Например, о более тонкой настройки sphinx и его возможностях?
ОтветитьПодскажите, пожалуйста, как настроить Sphinx для поиска по статическим html страницам сайта?
ОтветитьВ файле
Ответитьsphinx.conf.in
пропишите следующее:index filename
{
source = filesSrc
path = /путь/к/файлам
docinfo = extern
}
А что в source filesSrc писать, как указать каталог для файлов?
ОтветитьИ перезагрузите индексы
Ответитьспасибо
ОтветитьЗдравствуйте!
ОтветитьПомогите пожалуйста советом!
Sphinx служба запустилась, но в консоль MySql при проверке работы sphinx запросом: SELECT title FROM testDocIndex LIMIT 5;
Выдает ошибку ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 34
Current database: *** NONE ***
Как можно это исправить?
Попробуйте выполнить следующие действия:
Ответить1) Откройте файл my.cnf (для denwer
D:\web\usr\local\mysql-5.5
) на редактирование2) Измените
max_allowed_packet = 1M
наmax_allowed_packet = 64M
под[mysqld]
3) Добавьте
wait_timeout = 6000
под[mysqld]
4) Измените
max_allowed_packet = 16M
наmax_allowed_packet = 64M
под[mysqldump]
5) Сохраните файл и перезапустите
mysql
Автору спасибо, особенно за ответы в коментах, хорошая статья
ОтветитьУ меня система 32-бит и соответственно скачал релиз для нее. Делал по примеру, все проиндексировалось, но при запуске службы все время появляется ошибка 1067 (там еще появилась служба searchd и при ее запуске появляется та же ошибка). В чем может быть проблема?
ОтветитьАх да, сейчас в релизе несколько другие файлы, чем у вас на скриншоте.
А что searchd.log пишет?
ОтветитьНичего. И логи, и pid - пустые файлы.
ОтветитьПопробуйте выполнить следующие шаги:
Ответить1) Проверьте наличие папок Sphinx/data и Sphinx/log (при необходимости создайте их)
2) Выполните в консоле: C:\sphinx\bin> searchd
3) Выполните в консоле: C:\sphinx\bin>indexer --rotate –all
Служба не запускается. Ошибка 1067.
ОтветитьC:\Windows\system32>C:\Sphinx\bin\indexer --all --config C:\Sphinx\sphinx.conf.in --rotate
Sphinx 2.2.11-id64-release (95ae9a6)
Copyright (c) 2001-2016, Andrew Aksyonoff
Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)
using config file 'C:\Sphinx\sphinx.conf.in'...
indexing index 'speckrot1'...
ERROR: index 'speckrot1': sql_query_range: : range-query failed: Table 'spectehn
ika_mo.documents' doesn't exist (DSN=mysql://root:***@localhost:3306/spectehnika
_mo).
total 0 docs, 0 bytes
total 0.014 sec, 0 bytes/sec, 0.00 docs/sec
total 0 reads, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg
total 0 writes, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg
Причем тут таблица documents? Конечно у меня ее нет. Зачем она мне нужна! Разве нельзя указать свою?
При запросе в mysql таков ответ. Настройки вроде как подходят так как других быть и не может
ОтветитьERROR 1064 (42000): unknown local index 'Мой индекс' in search request
Статья не актуальна, настройки не работают на текущей версии сфинкса!
ОтветитьC:\Windows\System32>C:\Sphinx\bin\indexer --all --config C:\Sphinx\etc\sphinx.co
Ответитьnf.dist
Sphinx 3.0.3-dev (commit facc3fb)
Copyright (c) 2001-2018, Andrew Aksyonoff
Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)
using config file 'C:\Sphinx\etc\sphinx.conf.dist'...
indexing index 'testDocIndex'...
ERROR: index 'testDocIndex': first column in SQL query result must be document I
D; found 'id' attribute instead.
total 0 docs, 0.0 Kb
total 0.0 sec, 0.0 Kb/sec, 0 docs/sec
indexing index 'testDoc2Index'...
ERROR: index 'testDoc2Index': first column in SQL query result must be document
ID; found 'id' attribute instead.
total 0 docs, 0.0 Kb
total 0.0 sec, 0.0 Kb/sec, 0 docs/sec
C:\Windows\System32>
та же проблема. решили?
Ответитьsql_field_string = id убрал - заработало
Ответить