代码之家  ›  专栏  ›  技术社区  ›  Ahmad Samilo

在巨大的单词文件中搜索的最佳方法

  •  0
  • Ahmad Samilo  · 技术社区  · 10 年前

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

    所以我创建了一个读取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 回复  |  直到 10 年前
        1
  •  1
  •   Salvador Dali    10 年前

    您需要创建一个名为 inverse index ,它映射每个单词(如果您甚至想将短语映射到文档,也可以是)。Wiki页面很好地记录了这个过程,而且非常直接。

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

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