Расширенный поисковый движок для MySQL, который не требует уникального INT и охватывает несколько таблиц - PullRequest
0 голосов
/ 23 марта 2012

Недавно я разработал программное обеспечение, которое загружает файлы журналов из нашей производственной онлайн-среды на внутреннее устройство NAS с базой данных MySQL, чтобы позволить нам хранить больше информации (онлайн-пространство дорого).Эта штука работает и работает уже две недели, поэтому наша база данных растет: Количество таблиц журналов 411 Количество записей журнала 48 000 513 Прибл.размер таблиц: 37,32 ГБ

Каждый час создается другая журнальная таблица (с более чем 100 000 записей каждый раз), поэтому на данный момент у нас есть 411.

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

Однако, когда я ищу, например, "site"X "без указания диапазона дат, необходимо выполнить поиск более 400 таблиц, и каждая строка содержит большое сообщение XML, поэтому с каждым днем ​​все становится медленнее.

Я начал искать более сложные поисковые решения и нашел ихсо Sphinx и Solr, НО я просто не могу понять, что все правильно:

  • Я не могу найти, как настроить эти движки для поиска по всем таблицам (все они имеют одинаковую структуру),- Я мог бы преодолеть это путем динамического создания огромного представления или программного объединения таблиц на данный момент и добавления новых записей в одну таблицу в будущем, так что это не является большой проблемой.
  • Я пыталсяSphinx, но он требует целое число в качестве первичного ключа - и у нас есть GUID (онлайн-таблица MSSQL) ... Я всегда мог бы добавить числовой индекс, чтобы преодолеть это, но я не хочу:)
  • Я попробовал Solr, я настроил его на поиск в одной из 411 таблиц, но я не получил никаких результатов.После индексации мне сказали, что X записей были проиндексированы (около 12 000), что казалось правильным.Тем не менее, я не узнал, как на самом деле его искать.

Итог моего вопроса (-ов):

  • Есть ли более «удобный» графический интерфейс, доступный дляпоиск по Solr, так как это был тот, в котором я получил самое дальнее, кроме поисковой части
  • или есть ли способ настроить Sphinx с char (32) в качестве индекса?
  • Isnне существует ли какой-то поисковой системы, которая позаботится обо всем этом «беспорядке» для меня, поскольку я могу объединить все в одну таблицу, просто придется искать в одной таблице?
  • Существуют ли другие поисковые системы?(желательно бесплатно) Я должен изучить?
  • Было бы хорошей идеей создать одну большую таблицу, чтобы облегчить мою работу?По приблизительным подсчетам, он будет состоять из 1 248 013 338 или 970,32 ГБ через год (по крайней мере, поскольку количество файлов журнала в час будет только увеличиваться).Если я делаю это совершенно неправильно, пожалуйста, скажите мне.

Я надеюсь, что я достаточно прояснил мою проблему.Заранее спасибо.

edit: Тем временем я смог настроить Solr и найти его.Однако он создает индекс, который почти равен размеру исходной таблицы ... поэтому я думаю, что мне следует придерживаться собственной домашней поисковой системы ...?

1 Ответ

0 голосов
/ 23 марта 2012

(не имею опыта работы с solr, поэтому не могу вам помочь)

Или есть способ настроить Sphinx с char (32) в качестве индекса?

Сфинкс просто требует уникальный идентификатор.На самом деле он не должен совпадать с первичным ключом базы данных!

  • Вы можете сохранить его (реальный) в атрибутах, чтобы вернуть его при поиске.

Несколько способов получить идентификатор:

  • сделать подделку!

    sql_query_pre = SET @id = 1 sql_query = SELECT @id: = @ id + 1, ...

  • использовать хеширование

    sql_query =SELECT CRC32 (uuid), ...

    Хотя http://www.xaprb.com/blog/2008/03/09/a-very-fast-fnv-hash-function-for-mysql/ может быть даже лучше, и используется с --enable-id64 в sphinx.Вероятность столкновения мала (но не существует)

  • использовать только часть uuid.Зависит от того, как создается оригинал - например, имеет ли он общий префикс.

  • Если для хранения данных используется таблица innodb, mysql уже создаст целочисленный идентификатор для данных.См. http://dev.mysql.com/doc/refman/4.1/en/sorting-rows.html

(Sphinx также имеет несколько хитростей, помогающих индексировать большое количество таблиц. Конфигурационный «файл» может фактически быть скриптом. Таким образом, скрипт может просто выводить большойКоличество очень похожих определений индекса. И один индекс может иметь много «источников». Таким образом, один индекс может легко извлекать контент из нескольких исходных таблиц. Это помогает, потому что, хотя sphinx может иметь сотни таблиц, его многоЭто может стоить сгруппировать их. Скажем, 24 таблицы / источники на индекс.)

...