Para mantenerlo simple:no existe una forma rápida de abrir, buscar y cerrar 600k documentos cada vez que desea realizar una búsqueda. Sus puntos de referencia con "más de un minuto" son probablemente con cuentas de prueba únicas. Si planea buscarlos a través de un sitio web multiusuario, puede olvidarlo rápidamente, porque su disk IO
estará fuera de los gráficos y bloqueará todo su servidor.
Entonces, su única opción es indexar todos los archivos. Al igual que cualquier otra utilidad de búsqueda rápida. No importa si usa Solr o ElasticSearch como se menciona en los comentarios, o crea algo propio. Los archivos serán indexados.
Teniendo en cuenta el txt
los archivos son versiones de texto de pdf
archivos que recibe, apuesto a que la solución más fácil es escribir el texto en una base de datos en lugar de un archivo. De todos modos, no ocupará mucho más espacio en disco.
Luego puede habilitar full text search
en su base de datos (mysql
, mssql
y otros lo apoyan) y estoy seguro de que los tiempos de respuesta serán mucho mejores. Tenga en cuenta que al crear estos indexes
requieren espacio de almacenamiento, pero lo mismo ocurre con otras soluciones.
Ahora, si realmente desea acelerar las cosas, puede intentar analizar los currículos en un nivel más detallado. Pruebe y recupere ubicaciones, educación, idiomas hablados y otra información que busca regularmente y colóquelos en tablas/columnas separadas. Esta es una tarea muy difícil y casi un proyecto en sí mismo, pero si desea un resultado de búsqueda valioso, este es el camino a seguir. Debido a que buscar en texto sin contexto da resultados muy diferentes, solo piense en su ejemplo "nueva york":
- Vivo en Nueva York
- Estudié en la Universidad de Nueva York
- Me encanta la canción "nueva york" de Alicia Keys en una biografía personal
- Trabajé para New York Pizza
- Nací en Nueva York, Reino Unido
- Pasé un verano criando new yorkshire terriers.
No profundizaré demasiado, pero intentaré brindar pautas para crear una prueba de concepto.
1
Primero descargue y extraiga la búsqueda elástica desde aquí:https://www.elastic.co/downloads/elasticsearch y luego ejecútelo:
bin/elasticsearch
2
Descargue https://github.com/dadoonet/fscrawler#download-fscrawler, extráigalo y ejecútelo:
bin/fscrawler myCustomJob
Luego deténgalo (Ctrl-C) y edítelo el correspondiente myCustomJob/_settings.json
(Se ha creado automáticamente y la ruta se imprimió en la consola).
Puede editar las propiedades:"url"
(ruta a escanear),"update_rate"
(puedes hacerlo 1m
),"includes"
(por ejemplo, ["*.pdf","*.doc","*.txt"]
), "index_content"
(hazlo falso, para quedarte solo en el nombre del archivo).
Ejecutar de nuevo:
bin/fscrawler myCustomJob
Nota:La indexación es algo que tal vez desee realizar más adelante usando código, pero por ahora, se hará automáticamente, usando fscrawler
, que habla directamente con elastic.
3
Ahora comience a agregar archivos al directorio que especificó en "url"
propiedad.
4
Descargar cliente de descanso avanzado para Chrome y haz lo siguiente POST
:
URL:http://localhost:9200/_búsqueda
Carga útil sin procesar:
{
"query": { "wildcard": {"file.filename":"aFileNameToSearchFor*"} }
}
Obtendrá la lista de archivos coincidentes. Nota:fscrawler
está indexando los nombres de archivo bajo la clave:file.filename
.
5
Ahora, en lugar de usar cliente de descanso avanzado puede usar PHP para realizar esta consulta. Ya sea mediante una llamada REST a la URL anterior, o utilizando la API de php-client:https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/_search_operations.html
Lo mismo significa indexación:https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/_indexing_documents.html
Si desea guardar toda la información de los archivos en la base de datos:
<?php
function deep_scandir( $dir, &$query, &$files) {
$count = 0;
if(is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($item = readdir($dh)) !== false) {
if($item != '.' && $item != '..') {
if(is_dir($dir.'/'.$item)){
deep_scandir($dir.'/'.$item, $query, $files);
}else{
$count++;
preg_match("/(\d\_\d+)\_(.*)\.txt/i", $item, $matches);
if(!empty($matches)){
$no = $matches[1];
$str = $matches[2];
$files[$dir][$no] = $str;
$content = addcslashes( htmlspecialchars( file_get_contents($dir.'/'.$item) ), "\\\'\"" );
$query[] = "INSERT INTO `mytable` (id, key, value, path, content)
VALUES\n(NULL, '$no', '$str', '$dir/$item', '$content');";
}
}
}
}
closedir($dh);
}
}
return $count;
}
echo '<pre>';
$dir = 'notes_docs/files_txt';
$query = [];
$files = [];
echo deep_scandir($dir, $query, $files);
echo '<br>';
print_r($files);
echo '<br>';
print_r($query);
Ahora puede ejecutar cada línea en la matriz
foreach($query as $no=>$line){
mysql_query($line) or trigger_error("Couldn't execute query no: '$no' [$line]");
}
Salida:
Array
(
[notes_docs/files_txt/20170831] => Array
(
[1_291838733] => uridjdh
[1_482737439] => a8weele
[1_579374743] => abc2_file
[1_733839474] => dejsde
[1_837837472] => abc_file
)
)
Array
(
[0] => INSERT INTO `mytable` (id, key, value, path, content)
VALUES
(NULL, '1_291838733', 'uridjdh', 'notes_docs/files_txt/20170831/1_291838733_uridjdh.txt', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus in nisl quis lectus sagittis ullamcorper at faucibus urna. Suspendisse tristique arcu sit amet ligula cursus pretium vitae eu elit. Nullam sed dolor ornare ex lobortis posuere. Quisque venenatis laoreet diam, in imperdiet arcu fermentum eu. Aenean molestie ligula id sem ultricies aliquet non a velit. Proin suscipit interdum vulputate. Nullam finibus gravida est, et fermentum est cursus eu. Integer sed metus ac urna molestie finibus. Aenean hendrerit ante quis diam ultrices pellentesque. Duis luctus turpis id ipsum dictum accumsan. Curabitur ornare nisi ligula, non pretium nulla venenatis sed. Aenean pharetra odio nec mi aliquam molestie. Fusce a condimentum nisl. Quisque mattis, nulla suscipit condimentum finibus, leo ex eleifend felis, vel efficitur eros turpis nec sem. ');
[1] => INSERT INTO `mytable` (id, key, value, path, content)
VALUES
(NULL, '1_482737439', 'a8weele', 'notes_docs/files_txt/20170831/1_482737439_a8weele.txt', 'Nunc et odio sed odio rhoncus venenatis congue non nulla. Aliquam dictum, felis ac aliquam luctus, purus mi dignissim magna, vitae pharetra risus elit ac mi. Sed sodales dui semper commodo iaculis. Nunc vitae neque ut arcu gravida commodo. Fusce feugiat velit et felis pharetra posuere sit amet sit amet neque. Phasellus iaculis turpis odio, non consequat nunc consectetur a. Praesent ornare nisi non accumsan bibendum. Nunc vel ultricies enim, consectetur fermentum nisl. Sed eu augue ac massa efficitur ullamcorper. Ut hendrerit nisi arcu, a sagittis velit viverra ac. Quisque cursus nunc ac tincidunt sollicitudin. Cras eu rhoncus ante, ac varius velit. Mauris nibh lorem, viverra in porttitor at, interdum vel elit. Aliquam imperdiet lacus eu mi tincidunt volutpat. Vestibulum ut dolor risus. ');
[2] => INSERT INTO `mytable` (id, key, value, path, content)
VALUES
(NULL, '1_579374743', 'abc2_file', 'notes_docs/files_txt/20170831/1_579374743_abc2_file.txt', 'Vivamus aliquet id elit vitae blandit. Proin laoreet ipsum sed tincidunt commodo. Fusce faucibus quam quam, in ornare ex fermentum et. Suspendisse dignissim, tortor at fringilla tempus, nibh lacus pretium metus, vel tempus dolor tellus ac orci. Vestibulum in congue dolor, nec porta elit. Donec pellentesque, neque sed commodo blandit, augue sapien dapibus arcu, sit amet hendrerit felis libero id ante. Praesent vitae elit at eros faucibus volutpat. Integer rutrum augue laoreet ex porta, ut faucibus elit accumsan. Donec in neque sagittis, auctor diam ac, viverra diam. Phasellus vel quam dolor. Nullam nisi tellus, faucibus a finibus et, blandit ac nisl. Vestibulum interdum malesuada sem, nec semper mi placerat quis. Nullam non bibendum sem, vitae elementum metus. Donec non ipsum quis turpis semper lobortis.');
[3] => INSERT INTO `mytable` (id, key, value, path, content)
VALUES
(NULL, '1_733839474', 'dejsde', 'notes_docs/files_txt/20170831/1_733839474_dejsde.txt', 'Nunc faucibus, enim non luctus rutrum, lorem urna finibus turpis, sit amet dictum turpis ipsum pharetra ex. Donec at leo vitae massa consectetur viverra eget vel diam. Sed in neque tempor, vulputate quam sed, ullamcorper nisl. Fusce mollis libero in metus tincidunt interdum. Cras tempus porttitor nunc nec dapibus. Vestibulum condimentum, nisl eget venenatis tincidunt, nunc sem placerat dui, quis luctus nisl erat sed orci. Maecenas maximus finibus magna in facilisis. Maecenas maximus turpis eget dignissim fermentum. ');
[4] => INSERT INTO `mytable` (id, key, value, path, content)
VALUES
(NULL, '1_837837472', 'abc_file', 'notes_docs/files_txt/20170831/1_837837472_abc_file.txt', 'Integer non ex condimentum, aliquet lectus id, accumsan nibh. Quisque aliquet, ante vitae convallis ullamcorper, velit diam tempus diam, et accumsan metus eros at tellus. Sed lacinia mauris sem, scelerisque efficitur mauris aliquam a. Nullam non auctor leo. In mattis mauris eu blandit varius. Phasellus interdum mi nec enim imperdiet tristique. In nec porttitor erat, tempor malesuada ante. Etiam scelerisque ligula et ex maximus, placerat consequat nunc consectetur. Phasellus suscipit ligula sed elit hendrerit laoreet. Suspendisse ex sem, placerat pharetra ligula eu, accumsan rhoncus ex. Sed luctus nisi vitae metus maximus scelerisque. Suspendisse porta nibh eget placerat tempus. Nunc efficitur gravida sagittis. ');
)