Является ли автоматическое обновление Sphinx индексом при добавлении данных в SQL? - PullRequest
3 голосов
/ 28 сентября 2011

Мне любопытно, будет ли Sphinx автоматически обновлять свой индекс, когда вы добавляете новые данные SQL, или вам нужно указать это специально для переиндексации вашей базы данных.

Если это не так, делает ли кто-нибудьесть пример того, как автоматизировать этот процесс при изменении данных базы данных?

Ответы [ 3 ]

3 голосов
/ 03 октября 2011

Ответ - нет, и вам нужно сказать sphinx переиндексировать вашу базу данных.

Есть несколько шагов и требований, которые вам необходимо знать:

  1. Main и delta являются требованиями
  2. При первом запуске необходимо проиндексировать ваш основной индекс.
  3. После первого запуска вы можете индексировать дельту, вращая ее (чтобы убедиться, что служба работает и данные в Интернете могутбыть использованным в то время)
  4. Прежде чем идти дальше, вам нужно создать таблицу для пометки ваших "последних проиндексированных строк".ID последней индексированной строки можно использовать для следующей индексации дельты и слияния дельты с основной.
  5. Вам необходимо объединить свой дельта-индекс с основным индексом.как внутри документов sphinx http://sphinxsearch.com/docs/current.html#index-merging
  6. Перезапустите службу sphinx.

    СОВЕТЫ: ​​Создайте свою собственную программу, которая могла бы выполнять индекс, используя C # или другие языки.Вы можете попробовать расписание задач из окон также можно.

Вот мой конф:

source Main
{
type            = mysql

sql_host        = localhost
sql_user        = root
sql_pass        = password
sql_db          = table1
sql_port        = 3306  # optional, default is 3306
sql_query_pre = REPLACE INTO table1.sph_counter SELECT 1, MAX(PageID) FROM table1.pages;
sql_query       = \
    SELECT  pd.`PageID`, pd.Status from table1.pages pd
    WHERE pd.PageID>=$start AND pd.PageID<=$end \
    GROUP BY pd.`PageID`

sql_attr_uint       = Status

sql_query_info      = SELECT * FROM table1.`pages` pd WHERE pd.`PageID`=$id
sql_query_range     = SELECT MIN(PageID),MAX(PageID)\
              FROM tabl1.`pages`
sql_range_step      = 1000000
}


source Delta : Main
{
sql_query_pre = SET NAMES utf8

sql_query = \
    SELECT  PageID, Status from pages \
    WHERE PageID>=$start AND PageID<=$end 

sql_attr_uint       = Status

sql_query_info      = SELECT * FROM table1.`pages` pd WHERE pd.`PageID`=$id
sql_query_range     = SELECT (SELECT MaxDoc FROM table1.sph_counter WHERE ID = 1) MinDoc,MAX(PageID) FROM table1.`pages`;
sql_range_step      = 1000000
}


index Main
{
source          = Main
path            = C:/sphinx/data/Main
docinfo         = extern
charset_type        = utf-8
}


index Delta : Main
{
    source = Delta
path = C:/sphinx/data/Delta
charset_type = utf-8
}
2 голосов
/ 28 сентября 2011

Чтобы расширить ответ Анны - если вы используете индексы SQL, он не будет обновляться автоматически. Вы можете управлять процессом переиндексации после каждого изменения, но это может быть дорого. Один из способов обойти это - иметь основной индекс со всем, а затем дельта-индекс с той же структурой, которая индексирует только изменения (это может быть сделано с помощью логического столбца или столбца отметки времени).

Таким образом, вы можете просто переиндексировать дельта-индекс (который меньше и, следовательно, быстрее) на суперрегулярной основе, а затем обрабатывать ядро ​​и дельту вместе реже (но, тем не менее, лучше всего делать это хотя бы ежедневно). ).

Но в остальном, стоит обратить внимание на новые индексы RT - вам все равно нужно что-то обновлять самостоятельно, и это не привязано к базе данных, так что это другое мышление. Также: у индексов RT нет всех функций, которые есть у индексов SQL, поэтому вам нужно решить, что важнее.

2 голосов
/ 28 сентября 2011

Как указано в разделе документации sphinx об индексах в реальном времени

Индексы в реальном времени (или индексы RT для краткости) - это новый бэкэнд, который позволяет вам вставлять,обновлять или удалять документы (строки) на лету.

Таким образом, чтобы обновить индекс на лету, вам просто нужно сделать запрос типа

{INSERT | REPLACE} INTO index [(column, ...)]
VALUES (value, ...)
[, (...)]
...