GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Schnelle Textsuche in über 600.000 Dateien

Um es einfach zu halten:Es gibt keine schnelle Möglichkeit, jedes Mal, wenn Sie eine Suche durchführen möchten, 600.000 Dokumente zu öffnen, zu durchsuchen und zu schließen. Deine Benchmarks mit "über einer Minute" sind wahrscheinlich mit einzelnen Testaccounts. Wenn Sie vorhaben, diese über eine Multi-User-Website zu durchsuchen, können Sie dies schnell vergessen, da Ihr disk IO wird aus den Charts sein und Ihren gesamten Server blockieren.

Ihre einzige Option besteht also darin, alle Dateien zu indizieren. Genau wie jedes andere Schnellsuchprogramm. Egal, ob Sie wie in den Kommentaren erwähnt Solr oder ElasticSearch verwenden oder etwas Eigenes bauen. Die Dateien werden indiziert.

In Anbetracht der txt Dateien sind Textversionen von pdf Dateien, die Sie erhalten, wette ich, dass die einfachste Lösung darin besteht, den Text in eine Datenbank statt in eine Datei zu schreiben. Es wird sowieso nicht viel mehr Speicherplatz beanspruchen.

Dann können Sie full text search aktivieren in Ihrer Datenbank (mysql , mssql und andere unterstützen es) und ich bin mir sicher, dass die Antwortzeiten viel besser sein werden. Denken Sie daran, diese indexes zu erstellen benötigen Speicherplatz, aber das gilt auch für andere Lösungen.

Wenn Sie die Dinge wirklich beschleunigen möchten, können Sie versuchen, die Lebensläufe auf einer detaillierteren Ebene zu analysieren. Versuchen Sie, Standorte, Bildung, gesprochene Sprachen und andere Informationen, nach denen Sie regelmäßig suchen, abzurufen, und fügen Sie sie in separate Tabellen/Spalten ein. Dies ist eine sehr schwierige Aufgabe und fast ein eigenes Projekt, aber wenn Sie ein wertvolles Suchergebnis erhalten möchten, ist dies der richtige Weg. Da die Suche im Text ohne Kontext sehr unterschiedliche Ergebnisse liefert, denken Sie nur an Ihr Beispiel "new york":

  1. Ich lebe in New York
  2. Ich habe an der New York University studiert
  3. Ich liebe das Lied "New York" von Alicia Keys in einer persönlichen Biografie
  4. Ich habe für New York Pizza gearbeitet
  5. Ich wurde in New York, Großbritannien, geboren
  6. Ich verbrachte einen Sommer damit, New Yorker Terrier zu züchten.

Ich werde nicht zu tief gehen, aber ich werde versuchen, Richtlinien für die Erstellung eines Proof-of-Concept bereitzustellen.

1

Laden Sie zunächst die elastische Suche von hier herunter und extrahieren Sie sie:https://www.elastic.co/downloads/elasticsearch und führen Sie sie dann aus:

bin/elasticsearch

2

Laden Sie https://github.com/dadoonet/fscrawler#download-fscrawler herunter, extrahieren Sie es und führen Sie es aus:

bin/fscrawler myCustomJob

Stoppen Sie es dann (Strg-C) und bearbeiten den entsprechenden myCustomJob/_settings.json (Es wurde automatisch erstellt und der Pfad wurde auf der Konsole gedruckt).
Sie können die Eigenschaften bearbeiten:"url" (zu scannender Pfad),"update_rate" (Sie können es 1m machen ),"includes" (z. B. ["*.pdf","*.doc","*.txt"] ), "index_content" (machen Sie es falsch, um nur beim Dateinamen zu bleiben).

Erneut ausführen:

bin/fscrawler myCustomJob

Hinweis:Die Indizierung ist etwas, das Sie vielleicht später mit Code durchführen möchten, aber im Moment wird es automatisch mit fscrawler durchgeführt , das direkt mit elastisch kommuniziert.

3

Beginnen Sie nun mit dem Hinzufügen von Dateien zu dem Verzeichnis, das Sie in "url" angegeben haben Eigentum.

4

Laden Sie Advanced Rest Client herunter für Chrom und machen Sie den folgenden POST :

URL:http://localhost:9200/_search

Rohnutzlast:

{
  "query": { "wildcard": {"file.filename":"aFileNameToSearchFor*"} }
}

Sie erhalten die Liste der übereinstimmenden Dateien zurück. Hinweis:fscrawler indexiert die Dateinamen unter Schlüssel:file.filename .

5

Jetzt, anstatt den Advanced Rest Client zu verwenden Sie können PHP verwenden, um diese Abfrage durchzuführen. Entweder durch einen REST-Aufruf an die obige URL oder durch Verwendung der PHP-Client-API:https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/_search_operations.html

Dasselbe steht für Indexierung:https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/_indexing_documents.html


Wenn Sie alle Dateiinformationen in der Datenbank speichern möchten:

<?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);

Jetzt können Sie jede Zeile im Array ausführen

foreach($query as $no=>$line){
    mysql_query($line) or trigger_error("Couldn't execute query no: '$no' [$line]");
}

Ausgabe:

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. ');
)

Linux
  1. Suchen Sie nach Textdateien, in denen zwei verschiedene Wörter vorhanden sind (beliebige Reihenfolge, beliebige Zeile)?

  2. Mit Gui nach Dateien suchen?

  3. Ein Verzeichnis nach Dateien durchsuchen und das Ergebnis in eine Textdatei ausgeben?

  4. Extrahieren von Text aus MS-Word-Dateien in Python

  5. Rekursives Suchen und Ersetzen in Textdateien auf Mac und Linux

Grep-Befehl in Linux (Text in Dateien suchen)

So übertragen Sie Dateien mit Rsync über SSH

Wie man Textdateien unter Linux vergleicht und zusammenführt

So finden Sie Dateien, die eine bestimmte Textzeichenfolge in Linux enthalten

Finden Sie Text in Dateien unter Linux mit grep

Text auf der Terminalausgabe suchen?