Вопрос к специалистам по sphinx

Требуется помощь специалистов по sphinx.
Ситуация следующая.
Установил все (где-то пол года назад) согласно инструкции в этом топике

Сразу после установки создал индекс, запустил, проверил, на сайте все прекрасно начало искаться.

И вот сегодня по прошествии полугода (поиском не пользовался или просто не обращался внимания) сегодня я выяснил, что он ищет только старые записи, т.е те, которые попали в индекс сразу после установки.

Ну я подумал, что проблема в заданиях, которые я поставил в крон, что они не срабатывают и индекс не обновляется

в кроне прописано
@hourly /usr/bin/indexer --rotate commentsIndex > /dev/null 2>&1
@hourly /usr/bin/indexer --rotate topicsIndex > /dev/null 2>&1

зашел через SSH, вручную проверил запущен ли Сфинкс, результат
/etc/init.d/sphinxsearch start
Starting sphinxsearch: /usr/bin/searchd already running.


далее запускаю

/usr/bin/indexer --all --rotate
Sphinx 0.9.9-release (r2117)
Copyright © 2001-2009, Andrew Aksyonoff

using config file '/etc/sphinxsearch/sphinx.conf'...
indexing index 'topicsIndex'...
collected 343 docs, 0.5 MB
collected 557 attr values
sorted 0.0 Mvalues, 100.0% done
sorted 0.0 Mhits, 100.0% done
total 343 docs, 499289 bytes
total 0.148 sec, 3361015 bytes/sec, 2308.94 docs/sec
indexing index 'commentsIndex'...
collected 270 docs, 0.1 MB
sorted 0.0 Mhits, 100.0% done
total 270 docs, 77345 bytes
total 0.023 sec, 3239174 bytes/sec, 11307.47 docs/sec
total 5 reads, 0.000 sec, 54.6 kb/call avg, 0.0 msec/call avg
total 16 writes, 0.001 sec, 43.2 kb/call avg, 0.0 msec/call avg
rotating indices: succesfully sent SIGHUP to searchd (pid=7361).


Специально зашел в лог файл запросов и там есть мои поисковые запросы через сайт.

Проблема в том, что вроде как индекс вручную обновил, делаю поиск со словом, которое есть в самом последнем посте — он ничего не находит.

Этот запрос в логе запросов к нему есть

в конфиге сфинкса явно все прописано нормально, иначе бы он вообще не работал, а он работает, но только по какому-то урезанному (старому индексу)

Зашел в папку с индексом — там лежат файлы сегодняшнего дня, т.е явно, что сработала команда на обновления индекса.

вопрос в том, почему он не находит мне записи по тем запросам, которые касаются новых постов, но находит старые записи?

P.S.
Что в строчказ в крону означается концовка

@hourly /usr/bin/indexer --rotate commentsIndex > /dev/null 2>&1
@hourly /usr/bin/indexer --rotate topicsIndex > /dev/null 2>&1

а именно

> /dev/null 2>&1

я в этом не сильно шарю
Через SSH работает (выдает листинг) только /usr/bin/indexer --rotate topicsIndex, т.е без концовки
Если ввести /usr/bin/indexer --rotate topicsIndex > /dev/null 2>&1
то как будто отрабатывает, но ничего не выдает

P.P.S.
Приводу конфиг сфинкса чтобы тем, кто разбирается, проще было понять в чем проблема

## Конфигурационный файл Sphinx-а для индексации LiveStreet
 
#######################
#
# Описываем индексы
#
#######################
 
# Источник-родитель для всех остальных источников. Здесь указываются параметры доступа
# к базе данных сайта
source lsParentSource
{
        type            = mysql
        sql_host        = localhost
        sql_user        = Имя юзера
        sql_pass        = пароль
        sql_db          = имя базы
        sql_port        = 3306
        # Для ускорения работы прописываем путь до MySQL-го UNIX-сокета (чтобы
        # операции с БД происходили не через TCP/IP стек сервера)
        sql_sock        = /var/run/mysqld/mysqld.sock
   
       
        mysql_connect_flags     = 32 # 32- включение сжатие при обмене данными с БД
   
        # Включам нужную кодировку соединения и выключаем кеш запросов
        sql_query_pre                   = SET NAMES utf8
        sql_query_pre                   = SET SESSION query_cache_type=OFF    
}
 
# Источник топиков
source topicsSource : lsParentSource
{
        # запрос на получения данных топиков
        sql_query               = \
                SELECT t_fast.topic_id, t_fast.topic_title, UNIX_TIMESTAMP(t_fast.topic_date_add) as topic_date_add, \
                tc.topic_text, t_fast.topic_publish \
                FROM ls_topic as t_fast, ls_topic_content AS tc \
                WHERE t_fast.topic_id=tc.topic_id AND t_fast.topic_id>=$start AND t_fast.topic_id<=$end
 
        # запрос для дробления получения топиков на неколько итераций
        sql_query_range         = SELECT MIN(topic_id),MAX(topic_id) FROM ls_topic
       
        # сколько получать объектов за итерацию
        sql_range_step          = 1000
 
       
        # Указываем булевый атрибут критерия "топик опубликован". Для возможности указания этого критерия при поиске
        sql_attr_uint = topic_publish
 
        # Атрибут даты добавления, типа "время"
        sql_attr_timestamp      = topic_date_add
 
        # мульти-аттрибут "теги топика"
        sql_attr_multi  = uint tag from query; SELECT topic_id, topic_tag_id FROM ls_topic_tag
 
        sql_ranged_throttle     = 0
}
 
# Источник комментариев
source commentsSource : lsParentSource
{
        sql_query               = \
                        SELECT comment_id, comment_text, UNIX_TIMESTAMP(comment_date) as comment_date, comment_delete \
                        FROM ls_comment \
                        WHERE target_type='topic' AND comment_id>=$start AND comment_id<=$end AND comment_publish=1
 
        sql_query_range         = SELECT MIN(comment_id),MAX(comment_id) FROM ls_comment
        sql_range_step          = 5000
 
        sql_attr_uint = comment_delete
        sql_attr_timestamp      = comment_date
}
 
#######################
#
# Описываем индексы
#
#######################
 
index topicsIndex
{
        # Источник, который будет хранить данный индекса
        source                  = topicsSource
        path                    = /var/lib/sphinxsearch/topicIndex
 
        # Тип хранения аттрибутов
        docinfo                 = extern
 
        mlock                   = 0
 
        # Используемые морфологические движки
        morphology = stem_enru
 
        # Кодировака данных из источника    
        charset_type            = utf-8
 
 
        # Из данных источника HTML-код нужно вырезать
        html_strip                              = 1
        html_remove_elements = style, script, code
}
 
# Индекс комментариев
index commentsIndex
{
        source                  = commentsSource
        path                    = /var/lib/sphinxsearch/commentsIndex
 
        docinfo                 = extern
 
        mlock                   = 0
 
        morphology = stem_enru
 
        charset_type            = utf-8
        
        # Из данных источника HTML-код нужно вырезать
        html_strip                              = 1
        html_remove_elements = style, script, code
}
 
#######################
#
# Настройки индексатора
#
#######################
 
 
indexer
{
        # Лимит памяти, который может использавать демон-индексатор
        mem_limit                       = 128M
}
 
#######################
#
# Настройка демона-поисковика
#
#######################
 
searchd
{
        listen  = localhost:3312
		
		# Адрес, на котором будет прослушиваться порт
        #address                         = 127.0.0.1
 
 
        # Ну и собственно номер порта демона searchd
        #port                            = 3312
 
        # Лог-файл демона
        log                                     = /var/log/sphinxsearch/searchd.log
 
        # Лог поисковых запросов. Если закомментировать,то логировать поисковые строки не будет
        query_log                       = /var/log/sphinxsearch/query.log
 
        # Время в секундах, которое ждет демон при обмене данными с клиентом. По исчерпании происходит разрыв коннекта
        read_timeout            = 5
 
        # Максимальное количество одновременно-обрабатываемых запросов. 0 означает дофига, а точнее без ограничения
        max_children            = 100
 
        # Файл, в который сохраняется PID-процесса при запуске
        pid_file                        = /var/log/sphinxsearch/searchd.pid
}


в /congig/modules/search/config.php

прописано

$config['entity_prefix']  = '';
$config['sphinx']['host'] = 'localhost';
$config['sphinx']['port'] = '3312';

13 комментариев

avatar
У тебя "@hourly" не работает. Попробуй так сделать, если тебе надо каждый час:
* */1 * * * /usr/bin/indexer --rotate commentsIndex > /dev/null 2>&1
* */1 * * * /usr/bin/indexer --rotate topicsIndex > /dev/null 2>&1
avatar
бхыхы. почитал гeгл. сам посвятился. лучше так:
0 * * * * /usr/bin/indexer --rotate commentsIndex > /dev/null 2>&1
0 * * * * /usr/bin/indexer --rotate topicsIndex > /dev/null 2>&1

Спасибо за вопрос, узнал чего-то новое :)
avatar
Я думал о том, что @hourly может не срабатывать (это, кстати, панель хостера такую опцию предложила, я то изначально хотел по-старинке), но ведь я вручную эти команды через SSH запустил, индекс вроде как должен был переформироваться, однако новые записи он так и не находит. Хотя старые ищет без проблем.
avatar
Что в строчказ в крону означается концовка
Концовка заставляет команду быть совершенно тихой
> /dev/null

Это значит «перевести stdout в никуда» (т.е. не выводить результаты работы команды)
2>&1

Это значит «перевести stderr (поток 2) в stdout (поток 1)» (т.е. возможные ошибки направить не в отдельный поток вывода, а в стандартный. Но поскольку стандартный вывод уже направлен в null, ошибки тоже выводиться не будут)
avatar
Проверил черезз SSH поиск через search
search david
Sphinx 0.9.9-release (r2117)
Copyright © 2001-2009, Andrew Aksyonoff

using config file '/etc/sphinxsearch/sphinx.conf'...
index 'topicsIndex': query 'david ': returned 6 matches of 6 total in 0.020 sec

displaying matches:
1. document=121, weight=2, topic_date_add=Sat Mar 17 03:10:21 2012, topic_publis                                          h=0, tag=()
2. document=64, weight=1, topic_date_add=Sun Mar  4 13:49:23 2012, topic_publish                                          =1, tag=(237,238,239,240,241,242)
3. document=120, weight=1, topic_date_add=Sat Mar 17 03:02:30 2012, topic_publis                                          h=0, tag=()
4. document=205, weight=1, topic_date_add=Wed Jun 13 03:23:38 2012, topic_publis                                          h=0, tag=()
5. document=240, weight=1, topic_date_add=Wed Sep  5 01:44:14 2012, topic_publis                                          h=0, tag=()
6. document=281, weight=1, topic_date_add=Tue Oct 16 14:27:47 2012, topic_publis                                          h=1, tag=(484)

words:
1. 'david': 6 documents, 9 hits

index 'commentsIndex': query 'david ': returned 0 matches of 0 total in 0.000 sec

words:
1. 'david': 0 documents, 0 hits


с одной стороны видно, что поиск работает, а с другой, что он аналогичен результатам на сайте, т.е почему-то поиск идет по старым записям (новых в индексе, по которым он ищет — нет)
avatar
Что интересно, запустил индексатор после добавления еще одного топика и вот что он показывает

до добавления топика

collected 343 docs, 0.5 MB

после добавления

collected 344 docs, 0.5 MB

Видно, что количество топиков в его отчете — меняется. Только вот поиском по фразам последних постов — ни одного результата
avatar
обновил пост, включил туда свой конфиг sphinx чтобы было проще понятно что не так.

Провел еще один тест — вручную удалил файлы индекса — поиск ес-но ничего не находил.
Полностью заново создал индекс, поиск заработал, но опять не правильно и опять не находит новых записей.

помимо того, что он все-таки не находит новых записей, он почему-то стал искать так.
Ввожу запрос — он мне выдает кучу топиков с результатами (топики до определенного момента, не новые).
Выбираю один результат, т.к он явно не релевантен, захожу на его страницу и вижу, что в тексте топика и комментах нет ключевого слова для поиска, однако он есть в блоках в сайдбаре.
С какой стати он вдруг выдает в результатах топики, которые не содержат указанного слова, но содержат его в сайдбаре? Как это возможно?
avatar
Вообще индекс твой строиться только по тексту и заголовку заметки. Больше туда ничего не попадет.
avatar
потому и удивительно, что туда попали топики, где этого текста нет (он находится именно в сайдбаре)
avatar
Да, кстати, я разные варианты пробовал. Останавливал, удалял индекс, создавал заново, запускал.
при последнем запуске выдал такое

searchd
Sphinx 0.9.9-release (r2117)
Copyright © 2001-2009, Andrew Aksyonoff

using config file '/etc/sphinxsearch/sphinx.conf'...
WARNING: multiple addresses found for 'localhost', using the first one (ip=127.0.0.1)
listening on 127.0.0.1:3312


Не совсем понял что ему не нравится, на что это влияет и как исправить
avatar
Честно — теряюсь в догадках. Может Sphinx и LS у тебя с разной БД работают? :)
avatar
Я пришел в выводу, что это какая-то мистика, поэтому сделал следущее.

1. Поставил последнюю версию Sphinx (вероятно это и сыграло ключевую роль, как я думаб)
2. поправил запрос на создание индекса на тот, что вы привели в своем сегодняшнем топике

Результат — все ищет.

Единственное, что пока для меня осталось неясным — он при запуске пишет вот такое предупреждение

WARNING: compat_sphinxql_magics=1 is deprecated; please update your application and config

но ведь в конфиге этой опции нет, откуда это предупреждение?

версия у меня такая

searchd
Sphinx 2.0.6-id64-release (r3473)
avatar
Добавь
compat_sphinxql_magics = 0
в блок searchd своего конфига.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.