我在网上有大约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()
答案 0 :(得分:1)
您需要创建一个名为inverse index的结构,该结构可以映射每个单词(或者如果您希望偶数短语也可以映射到文档)。 Wiki页面很好地记录了这个过程,而且非常简单。
您可以将此结构存储在数据库中(这在预处理步骤中只会执行一次),以后可能会在添加新的Doc或Docx文件时更改。
当用户插入他的单词时,不是在文件中搜索,而是在数据库中搜索,这将很快并且将利用索引。