Mimo że istnieje wbudowany mechanizm, Data Import Handler (DIH)
, jak wspomniano w innych odpowiedziach, uważam, że to narzędzie nie jest zbyt elastyczne. Mam na myśli to, że gdybym chciał wykonać masowanie danych przed indeksowaniem, mógłbym polegać tylko na funkcjach MySQL, podczas gdy mogłem używać funkcji PHP.
Skończyło się na napisaniu własnego modułu obsługi importu danych jako skryptu PHP, w którym wykonuje początkowe zapytanie, a następnie przechodzi przez wyniki i masuje (i buforuje) dane po wstawieniu do indeksu SOLR. Nie było to zbyt skomplikowane i wyglądałoby mniej więcej tak (tylko demonstracyjnie):
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());
}
}
To tylko przykład tego, co możesz zrobić. W mojej sytuacji włączam również buforowanie, aby zwiększyć wydajność, gdy robię pełny import. Coś, czego nie można zrobić przy użyciu natywnego DIH.
API, którego używam do uzyskania dostępu do SOLR przez PHP to solr-php-client , mogą być inni, więc poszukaj w Google.