Sphinx рдФрд░ PHP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ PDF, DOC, DOCX рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЦреЛрдЬреЗрдВ

рджрд┐рди рдХрд╛ рдЕрдЪреНрдЫрд╛ рд╕рдордпред

рдореИрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ PDF, DOC рдФрд░ DOCX рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП PHP рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ Sphinx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рд╕реЗ рд╕рднреА рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдлрд┐рдВрдХреНрд╕ рдФрд░ рдкреАрдПрдЪрдкреА рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдерд╛ред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдПрдХ рд╕рдордп рдореЗрдВ рдЖрдИрдмреАрдПрдо рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдорд╛рд░реНрдЯрд┐рди рд╕реНрдЯреНрд░реАрдЪрд░ рдХреЗ рд▓реЗрдЦ " рдХреНрд░рд┐рдПрдЯ рдпреЛрд░ рдУрди рд╕рд░реНрдЪ рдЗрдВрдЬрди рдпреВрдЬрд╝рд┐рдВрдЧ рдкреАрдПрдЪрдкреА" рдХреЗ рд▓реЗрдЦ рд╕реЗ рдореБрдЭреЗ рдмрд╣реБрдд рдорджрдж рдорд┐рд▓реАред

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдореБрдЭреЗ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреЛрдЬ рдХреЗ рдЖрдпреЛрдЬрди рдХрд╛ рдХрд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрд░реЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦреА рдЧрдИ рдереА рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдлрд┐рдВрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдХрд╛рд░реНрдп рддреБрдЪреНрдЫ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдереЛрдбрд╝реА рд╕реА рдЧреБрдЧрд▓реА рдХрд░рддреЗ рд╣реБрдП, рдореБрдЭреЗ рдкреАрдбреАрдПрдл, рдбреАрдУрд╕реА рдФрд░ рдбреЙрдХреНрд╕ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЦреЛрдЬ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдкрд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЬреЛ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдерд╛ред

рд╕реНрдлрд┐рдВрдХреНрд╕ рдХреЗрд╡рд▓ XML рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд╛рда рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, xmlpipe рдпрд╛ xmlpipe2 рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдкреАрдбреАрдПрдл, рдбреАрдУрд╕реА рдФрд░ рдбреАрдУрд╕реАрдПрдХреНрд╕ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЕрдиреБрдХреНрд░рдордг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдПрдХреНрд╕рдПрдордПрд▓ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕реНрдлрд┐рдВрдХреНрд╕ рдХреЛ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рдЬрд╛рдПрдЧреА, рдбреЗрдЯрд╛ рдкрдврд╝реЗрдЧреА рдФрд░ рдЗрд╕реЗ рд╕рд╣реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рджреЗрдЧреАред
рдиреАрдЪреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдХреЛрдб рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЕрдиреБрдХреНрд░рдордг рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░реЗрдЧрд╛ред

Sphinx.conf рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ:
#    source SourceParseXml { #  xmlpipe2,    type = xmlpipe2 # ,    ,   XML.  xml-parser.php  XML xmlpipe_command = /path/to/php /path/to/xml-parser.php } #   index IndexParseXml { # ,    source = SourceParseXml #      path = /path/where/to/store/index-data #      min_word_len = 1 #   charset_type = utf-8 } #   indexer { #       mem_limit = 32M } 


Xml-parser.php рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдЬреЛ Sphinx-a рдХреЗ рд▓рд┐рдП XML рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИ:
 $allowedMimes = array( 'application/pdf', 'application/zip', // docx 'application/vnd.ms-office', // doc    OpenOffice 'application/msword' ); $allowedExtentions = array('pdf', 'docx', 'doc'); $pdfInfoPath = '/usr/bin/pdfinfo'; //    pdfinfo $pdfToTextPath = '/usr/bin/pdftotext'; //    pdftotext $catDocPath = '/usr/bin/catdoc'; //    catdoc //   Znd-     docx define('FILE_PATH', realpath(dirname(__FILE__)) . DIRECTORY_SEPARATOR); if (strpos(get_include_path(), 'Zend.phar.gz') === false) { ini_set('include_path', ini_get('include_path') . ':phar\://' . FILE_PATH . 'Zend.phar.gz'); } $phar = new Phar(FILE_PATH . 'Zend.phar.gz', 0, 'Zend.phar.gz'); if (isset($phar['Zend/Search/Lucene/Document/Docx.php'])) { require_once($phar['Zend/Search/Lucene/Document/Docx.php']); } else { echo 'ERROR: can\'t load "Zend/Search/Lucene/Document/Docx.php" !' . PHP_EOL; die; } //   XML $xmlWriter = new xmlWriter(); $xmlWriter->openMemory(); $xmlWriter->setIndent(true); $xmlWriter->startDocument('1.0', 'UTF-8'); $xmlWriter->startElement('sphinx:docset'); $xmlWriter->startElement('sphinx:schema'); $xmlWriter->startElement('sphinx:field'); $xmlWriter->writeAttribute('name', 'content'); $xmlWriter->endElement(); // field $xmlWriter->endElement(); // schema /*       files,       ,   id . : files/01/file.pdf */ //     files foreach (new DirectoryIterator(dirname(__FILE__) . '/files') as $folder) { // ,      if (!$folder->isDir() || $folder->isDot()) { continue; } //           foreach (new DirectoryIterator($folder->getPathname()) as $file) { //         if ($file->isDir() || !in_array(strtolower(pathinfo($file, PATHINFO_EXTENSION)), $allowedExtentions) || !in_array(mime_content_type($file->getPathname()), $allowedMimes)) { continue; } $text = ''; $filePath = $file->getPathname(); $filePathEscape = escapeshellarg($filePath); try { switch (mime_content_type($filePath)) { case 'application/pdf': { $pdfInfo = array(); $key = ''; $val = ''; //     PDF  foreach (explode("\n", shell_exec(escapeshellcmd($pdfInfoPath . ' ' . $filePathEscape))) as $str) { list($key, $val) = count(explode(':', $str)) == 2 ? explode(':', $str) : array('', ''); if (trim($key) && trim($val)) { $pdfInfo[trim($key)] = trim($val); } } //    if (empty($pdfInfo) || (isset($pdfInfo['Error']) && $pdfInfo['Error'])) { continue; } //   pdftotext    $text = shell_exec(escapeshellcmd($pdfToTextPath . ' -nopgbrk ' . $filePathEscape . ' -')); break; } case 'application/zip' : { $file = Zend_Search_Lucene_Document_Docx::loadDocxFile($filePath); //   Zend_Search_Lucene_Document_Docx    $text = $file->getFieldValue('body'); break; } case ('application/vnd.ms-office' || 'application/msword'): { //   catdoc    $text = shell_exec(escapeshellcmd($catDocPath . ' ' . $filePathEscape)); break; } } if (empty($text)) { continue; } $text = strip_tags($text); $givenEncode = mb_detect_encoding($text); //      UTF-8 $text = $givenEncode ? iconv($givenEncode, 'UTF-8', $text) : mb_convert_encoding($text, 'UTF-8'); } catch (Exception $e) { echo $e->getMessage() . PHP_EOL; continue; } $xmlWriter->startElement('sphinx:document'); // $folder->getBasename() -        . //      $xmlWriter->writeAttribute('id', $folder->getBasename()); $xmlWriter->startElement('content'); $xmlWriter->writeCData($text); $xmlWriter->endElement(); // content $xmlWriter->endElement(); // field } } $xmlWriter->endElement(); $xml = $xmlWriter->outputMemory(); $tidy = tidy_repair_string($xml, array( 'output-xml' => true, 'input-xml' => true ), 'utf8'); echo $tidy; 

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕реНрдлрд┐рдВрдХреНрд╕-рдПрдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИред
Pdftotext рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреАрдбреАрдПрдл рдлрд╛рдЗрд▓ рд╕реЗ рдкрд╛рда рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред DOC рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП - рдХреИрдЯрдбреЙрдХ ред DOCX рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдкрд╛рда рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП Zend рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдпрд╣рд╛рдБ Phar рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕реНрдлрд┐рдВрдХреНрд╕ рдкреНрд░рд▓реЗрдЦрди , рд╕рд╛рде рд╣реА рдЗрдВрдбреЗрдХреНрд╕рд░ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдПрдХреНрд╕рдПрдордПрд▓ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг ред

рдКрдкрд░ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдиреБрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП XML рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рджреЗрддрд╛ рд╣реИред
рдЕрдм, рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп, рд╕реНрдлрд┐рдВрдХреНрд╕ рдЙрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХреА рдЖрдИрдбреА рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдореИрдЪ рдорд┐рд▓рд╛ рд╣реИред рдЖрдк рдЕрднреА рднреА рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдкрдиреЗ рд▓реЗрдЦ рдореЗрдВ rednaxi "рд╕реНрдлрд┐рдВрдХреНрд╕ + php рдореЗрдВ рдПрдХ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рдЦреЛрдЬ рдЗрдВрдЬрди рдмрдирд╛рдирд╛" рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╕реНрдлрд┐рдВрдХреНрд╕ рдФрд░ рдкреАрдПрдЪрдкреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

Source: https://habr.com/ru/post/In131089/


All Articles