Pour faire simple :il n'existe aucun moyen rapide d'ouvrir, de rechercher et de fermer 600 000 documents à chaque fois que vous souhaitez effectuer une recherche. Vos repères avec "plus d'une minute" concernent probablement des comptes de test uniques. Si vous envisagez de les rechercher via un site Web multi-utilisateurs, vous pouvez rapidement l'oublier, car votre disk IO
sera hors des charts et bloquera tout votre serveur.
Votre seule option est donc d'indexer tous les fichiers. Comme tous les autres utilitaires de recherche rapide. Peu importe que vous utilisiez Solr ou ElasticSearch comme mentionné dans les commentaires, ou que vous construisiez vous-même quelque chose. Les fichiers seront indexés.
Considérant le txt
les fichiers sont des versions texte de pdf
fichiers que vous recevez, je parie que la solution la plus simple consiste à écrire le texte dans une base de données au lieu d'un fichier. De toute façon, cela ne prendra pas beaucoup plus d'espace disque.
Ensuite, vous pouvez activer full text search
sur votre base de données (mysql
, mssql
et d'autres le soutiennent) et je suis sûr que les temps de réponse seront bien meilleurs. Gardez à l'esprit que la création de ces indexes
nécessitent un espace de stockage, mais il en va de même pour les autres solutions.
Maintenant, si vous voulez vraiment accélérer les choses, vous pouvez essayer d'analyser les CV à un niveau plus détaillé. Essayez de récupérer les lieux, l'éducation, les langues parlées et d'autres informations que vous recherchez régulièrement et placez-les dans des tableaux/colonnes séparés. C'est une tâche très difficile et presque un projet en soi, mais si vous voulez un résultat de recherche valable, c'est la voie à suivre. Parce que la recherche dans le texte sans contexte donne des résultats très différents, pensez à votre exemple "new york":
- J'habite à New York
- J'ai étudié à l'université de New York
- J'adore la chanson "new york" d'Alicia Keys dans une biographie personnelle
- J'ai travaillé pour New York Pizza
- Je suis né dans le New Yorkshire, au Royaume-Uni
- J'ai passé un été à élever des terriers du New York.
Je n'irai pas trop loin, mais je vais essayer de fournir des lignes directrices pour créer une preuve de concept.
1
Téléchargez et extrayez d'abord la recherche élastique à partir d'ici :https://www.elastic.co/downloads/elasticsearch, puis exécutez-la :
bin/elasticsearch
2
Téléchargez https://github.com/dadoonet/fscrawler#download-fscrawler, extrayez-le et exécutez-le :
bin/fscrawler myCustomJob
Puis arrêtez-le (Ctrl-C) et éditez le myCustomJob/_settings.json
correspondant (Il a été créé automatiquement et le chemin a été imprimé sur la console).
Vous pouvez modifier les propriétés :"url"
(chemin à scanner),"update_rate"
(vous pouvez en faire 1m
),"includes"
(par exemple ["*.pdf","*.doc","*.txt"]
), "index_content"
(rendez-le faux, pour ne rester que sur le nom du fichier).
Exécutez à nouveau :
bin/fscrawler myCustomJob
Remarque :L'indexation est quelque chose que vous voudrez peut-être effectuer ultérieurement à l'aide de code, mais pour l'instant, elle sera effectuée automatiquement, à l'aide de fscrawler
, qui communique directement avec elastic.
3
Commencez maintenant à ajouter des fichiers au répertoire que vous avez spécifié dans "url"
propriété.
4
Télécharger le client de repos avancé pour chrome et faites le POST
suivant :
URL :http://localhost:9200/_search
Charge utile brute :
{
"query": { "wildcard": {"file.filename":"aFileNameToSearchFor*"} }
}
Vous récupérerez la liste des fichiers correspondants. Remarque :fscrawler
indexe les noms de fichiers sous la clé :file.filename
.
5
Maintenant, au lieu d'utiliser le client de repos avancé vous pouvez utiliser PHP pour effectuer cette requête. Soit par un appel REST à l'url ci-dessus, soit en utilisant l'API php-client :https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/_search_operations.html
Il en va de même pour l'indexation :https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/_indexing_documents.html
Si vous souhaitez enregistrer toutes les informations sur les fichiers dans la base de données :
<?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);
Vous pouvez maintenant exécuter chaque ligne du tableau
foreach($query as $no=>$line){
mysql_query($line) or trigger_error("Couldn't execute query no: '$no' [$line]");
}
Sortie :
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. ');
)