Aby to bylo jednoduché:Neexistuje žádný rychlý způsob, jak otevřít, prohledat a zavřít 600 tisíc dokumentů pokaždé, když chcete provést vyhledávání. Vaše srovnávací hodnoty s „přes minutu“ jsou pravděpodobně s jednotlivými testovacími účty. Pokud je plánujete prohledávat na webu pro více uživatelů, můžete na to rychle zapomenout, protože vaše disk IO
bude mimo grafy a zablokuje celý váš server.
Takže vaše jediná možnost je indexovat všechny soubory. Stejně jako každý jiný nástroj pro rychlé vyhledávání. Nezáleží na tom, zda používáte Solr nebo ElasticSearch, jak je uvedeno v komentářích, nebo si postavíte něco vlastního. Soubory budou indexovány.
S ohledem na txt
soubory jsou textové verze pdf
soubory, které obdržíte, vsadím se, že nejjednodušším řešením je zapsat text do databáze místo do souboru. Stejně nezabere mnohem více místa na disku.
Poté můžete povolit full text search
ve vaší databázi (mysql
, mssql
a ostatní to podporují) a jsem si jistý, že doba odezvy bude mnohem lepší. Mějte na paměti, že vytváření těchto indexes
vyžadují úložný prostor, ale totéž platí pro jiná řešení.
Nyní, pokud opravdu chcete věci urychlit, můžete zkusit analyzovat životopisy na podrobnější úrovni. Vyzkoušejte a načtěte místa, vzdělání, mluvené jazyky a další informace, které pravidelně hledáte, a vložte je do samostatných tabulek/sloupců. Jedná se o velmi obtížný úkol a téměř samostatný projekt, ale pokud chcete hodnotný výsledek vyhledávání, toto je cesta. Protože vyhledávání v textu bez kontextu poskytuje velmi odlišné výsledky, vzpomeňte si na svůj příklad „new york“:
- Žiji v New Yorku
- Studoval jsem na New York University
- Miluji píseň „new york“ od Alicie Keys v osobním životopise
- Pracoval jsem pro New York Pizza
- Narodil jsem se v new yorkshire ve Velké Británii
- Strávil jsem léto chovem nových jorkšírských teriérů.
Nepůjdu příliš hluboko, ale pokusím se poskytnout pokyny pro vytvoření důkazu konceptu.
1
Nejprve si stáhněte a extrahujte elastické vyhledávání odtud:https://www.elastic.co/downloads/elasticsearch a poté jej spusťte:
bin/elasticsearch
2
Stáhněte si https://github.com/dadoonet/fscrawler#download-fscrawler rozbalte jej a spusťte:
bin/fscrawler myCustomJob
Poté jej zastavte (Ctrl-C) a upravte odpovídající myCustomJob/_settings.json
(Byla vytvořena automaticky a cesta byla vytištěna na konzole).
Můžete upravit vlastnosti:"url"
(cesta ke skenování),"update_rate"
(můžete to udělat 1m
),"includes"
(např. ["*.pdf","*.doc","*.txt"]
), "index_content"
(udělejte to false, abyste zůstali pouze u názvu souboru).
Spustit znovu:
bin/fscrawler myCustomJob
Poznámka:Indexování je něco, co byste mohli později chtít provádět pomocí kódu, ale prozatím se bude provádět automaticky pomocí fscrawler
, který přímo mluví s elastickým.
3
Nyní začněte přidávat soubory do adresáře, který jste zadali v "url"
vlastnost.
4
Stáhněte si pokročilého klienta pro odpočinek pro Chrome a vytvořte následující POST
:
URL:http://localhost:9200/_search
Nezpracované užitečné zatížení:
{
"query": { "wildcard": {"file.filename":"aFileNameToSearchFor*"} }
}
Získáte zpět seznam odpovídajících souborů. Poznámka:fscrawler
indexuje názvy souborů pod klíčem:file.filename
.
5
Nyní namísto použití pokročilého klienta pro odpočinek k provedení tohoto dotazu můžete použít PHP. Buď voláním REST na výše uvedenou adresu URL, nebo pomocí rozhraní php-client api:https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/_search_operations.html
Totéž platí pro indexování:https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/_indexing_documents.html
Pokud chcete uložit informace o všech souborech do databáze:
<?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);
Nyní můžete spustit každý řádek v poli
foreach($query as $no=>$line){
mysql_query($line) or trigger_error("Couldn't execute query no: '$no' [$line]");
}
Výstup:
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. ');
)