Несмотря на то, что для этой самой вещи есть встроенный механизм, Data Import Handler (DIH)
, как упоминалось в других ответах, я нашел этот инструмент не очень гибким.Под этим я подразумеваю, что если бы я хотел выполнить какое-либо массирование данных перед индексацией, я мог зависеть только от функций MySQL, когда я мог бы использовать функции PHP.
В итоге я написал свой собственный обработчик импорта данных какСкрипт PHP, где он выполняет начальный запрос, затем выполняет пошаговый просмотр результатов и массирует (и кэширует) данные при вставке в индекс SOLR.Это не было слишком сложно и выглядело бы примерно так (только для демонстрации):
SELECT
book.id AS book_id,
book.name AS book_name,
GROUP_CONCAT(DISTINCT author.name) AS authors
FROM
book
INNER JOIN
link_book_author AS alink ON alink.book_id = book.id
INNER JOIN
author ON author.id = alink.author_id
GROUP BY
book.id;
$stmt = $dbo->prepare($sql);
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_OBJ)) {
try {
$document = new Apache_Solr_Document();
$document->Id = $row->book_id;
$document->BookName = $row->book_name;
$document->Author = explode(',' $row->author);
$this->getSearchEngineInstance()->addDocument($document);
} catch (Exception $e) {
error_log(sprintf('Unable to add document to index: (%s)', $e->getMessage());
}
}
Это всего лишь пример того, что вы можете сделать. В моей ситуации я также использую кэширование для повышения производительности, когда я делаюполный импорт.Что-то, что вы не можете сделать, используя собственный DIH.
API, который я использую для доступа к SOLR через PHP, это solr-php-client , могут быть и другие, так что гуглите вокруг.