搜索巨大的word文件的最佳方法

时间:2014-02-24 20:23:17

标签: php ms-word docx doc

我在网上有大约5000个文件的文字文件,我需要在所有文件中搜索任何关键字 例如:“人力资源”。

所以我创建了读取word文件的功能,但我的问题是我猜处理任务会杀死服务器的内存 示例代码:

<?php 
function doc_to_text($input_file){ //for doc files 
    $file_handle = @fopen($input_file, "r"); //open the file
    $stream_text = @fread($file_handle, filesize($input_file));
    $stream_line = explode(chr(0x0D),$stream_text);
    $output_text = "";
    foreach($stream_line as $single_line){
        $line_pos = strpos($single_line, chr(0x00));
        if(($line_pos !== FALSE) || (strlen($single_line)==0)){
            $output_text .= "";
        }else{
            $output_text .= $single_line." ";
        }
    }
    $output_text = preg_replace("/[^a-zA-Z0-9\s\,\.\-\n\r\t@\/\_\(\)]/", "", $output_text);
    return $output_text;
}


function docx_to_text($input_file){ //for docx files
    $xml_filename = "word/document.xml"; //content file name
    $zip_handle = new ZipArchive;
    $output_text = "";
    if(true === $zip_handle->open($input_file)){
        if(($xml_index = $zip_handle->locateName($xml_filename)) !== false){
            $xml_datas = $zip_handle->getFromIndex($xml_index);
            $xml_handle = DOMDocument::loadXML($xml_datas, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
            $output_text = strip_tags($xml_handle->saveXML());
        }else{
            $output_text .="";
        }
        $zip_handle->close();
    }else{
    $output_text .="";
    }
    return $output_text;
}





?>

然后我将创建循环并通过stristr()函数检查每个文件的关键字,如果stristr()返回true,则脚本将打印文件名。

我们还有其他解决方案吗?

参考: stristr()

1 个答案:

答案 0 :(得分:1)

您需要创建一个名为inverse index的结构,该结构可以映射每个单词(或者如果您希望偶数短语也可以映射到文档)。 Wiki页面很好地记录了这个过程,而且非常简单。

您可以将此结构存储在数据库中(这在预处理步骤中只会执行一次),以后可能会在添加新的Doc或Docx文件时更改。

当用户插入他的单词时,不是在文件中搜索,而是在数据库中搜索,这将很快并且将利用索引。