sql >> Databasteknik >  >> RDS >> Mysql

Automatisk import av data från mysql till solr

Även om det finns en inbyggd mekanism för just detta, Data Import Handler (DIH) , som nämnts i de andra svaren, tyckte jag att det här verktyget inte var särskilt flexibelt. Vad jag menar med detta är att om jag ville göra någon datamassage före indexering kunde jag bara lita på MySQL-funktioner, när jag kunde ha använt PHP-funktioner.

Det slutade med att jag skrev min egen dataimporthanterare som ett PHP-skript, där den gör den första frågan och sedan går igenom resultaten och masserar (och cachar) data när den infogas i SOLR-indexet. Det var inte alltför komplicerat och skulle se ut ungefär som (endast demonstrativt):

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());
    }
}

Det här är bara ett exempel på vad du kan göra. I min situation involverar jag också cachning för att öka prestandan när jag gör en fullständig import. Något du inte kan göra med den inhemska DIH.

API:et jag använder för att komma åt SOLR via PHP är solr-php-client , det kan finnas andra där ute, så googla runt.



  1. Hur avgör jag om jag har oengagerade skrivningar i en MySQL-transaktion?

  2. Skapa en användare med alla rättigheter i Oracle

  3. Hur får man ett index av olika kategorier returnerat efter order av sql i Oracle?

  4. php - laravel :Hur hanterar man tidsöverlappning i databasen?