GNU/Linux >> Belajar Linux >  >> Linux

Pencarian teks cepat di lebih dari 600.000 file

Sederhananya:Tidak ada cara cepat untuk membuka, mencari, dan menutup 600 ribu dokumen setiap kali Anda ingin melakukan pencarian. Tolok ukur Anda dengan "lebih dari satu menit" mungkin dengan akun pengujian tunggal. Jika Anda berencana untuk mencarinya melalui situs multi-pengguna, Anda dapat segera melupakannya, karena disk IO Anda akan keluar dari tangga lagu dan memblokir seluruh server Anda.

Jadi satu-satunya pilihan Anda adalah mengindeks semua file. Sama seperti utilitas pencarian cepat lainnya. Tidak masalah jika Anda menggunakan Solr atau ElasticSearch seperti yang disebutkan di komentar, atau membuat sesuatu sendiri. File akan diindeks.

Mempertimbangkan txt file adalah versi teks dari pdf file yang Anda terima, saya bertaruh solusi termudah adalah dengan menulis teks ke database, bukan file. Lagipula itu tidak akan memakan lebih banyak ruang disk.

Kemudian Anda dapat mengaktifkan full text search di basis data Anda (mysql , mssql dan lainnya mendukungnya) dan saya yakin waktu responsnya akan jauh lebih baik. Ingatlah bahwa membuat indexes ini memang membutuhkan ruang penyimpanan, tetapi hal yang sama berlaku untuk solusi lain.

Sekarang jika Anda benar-benar ingin mempercepat, Anda dapat mencoba menguraikan resume pada tingkat yang lebih detail. Coba dan ambil lokasi, pendidikan, bahasa lisan, dan informasi lain yang biasa Anda telusuri dan letakkan di tabel/kolom terpisah. Ini adalah tugas yang sangat sulit dan hampir merupakan proyek sendiri, tetapi jika Anda menginginkan hasil pencarian yang berharga, inilah caranya. Karena menelusuri dalam teks tanpa konteks memberikan hasil yang sangat berbeda, pikirkan saja contoh Anda "new york":

  1. Saya tinggal di New York
  2. Saya belajar di Universitas New York
  3. Saya suka lagu "new york" dari Alicia Keys di biodata pribadi
  4. Saya bekerja untuk New York Pizza
  5. Saya lahir di new yorkshire, Inggris
  6. Saya menghabiskan musim panas membiakkan anjing terrier new yorkshire.

Saya tidak akan membahas terlalu dalam, tetapi saya akan mencoba memberikan panduan untuk membuat pembuktian konsep.

1

Pertama Unduh dan ekstrak penelusuran elastis dari sini:https://www.elastic.co/downloads/elasticsearch lalu jalankan:

bin/elasticsearch

2

Unduh https://github.com/dadoonet/fscrawler#download-fscrawler ekstrak dan jalankan:

bin/fscrawler myCustomJob

Kemudian hentikan (Ctrl-C) dan edit myCustomJob/_settings.json yang sesuai (Itu telah dibuat secara otomatis dan jalur dicetak di konsol).
Anda dapat mengedit properti:"url" (jalur yang akan dipindai),"update_rate" (Anda dapat membuatnya 1m ),"includes" (misalnya ["*.pdf","*.doc","*.txt"] ), "index_content" (buat salah, untuk tetap menggunakan nama file).

Jalankan lagi:

bin/fscrawler myCustomJob

Catatan:Pengindeksan adalah sesuatu yang mungkin ingin Anda lakukan nanti menggunakan kode, tetapi untuk saat ini, ini akan dilakukan secara otomatis, menggunakan fscrawler , yang langsung berbicara dengan elastis.

3

Sekarang mulailah menambahkan file ke direktori yang Anda tentukan di "url" properti.

4

Unduh klien istirahat lanjutan untuk chrome dan buat POST berikut :

URL:http://localhost:9200/_search

Muatan mentah:

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

Anda akan mendapatkan kembali daftar file yang cocok. Catatan:fscrawler sedang mengindeks nama file dengan kunci:file.filename .

5

Sekarang, alih-alih menggunakan klien istirahat lanjutan Anda dapat menggunakan PHP, untuk melakukan kueri ini. Baik dengan panggilan REST ke url di atas, atau dengan memanfaatkan php-client api:https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/_search_operations.html

Singkatan yang sama untuk pengindeksan:https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/_indexing_documents.html


Jika Anda ingin menyimpan semua info file ke dalam database:

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

Sekarang Anda dapat mengeksekusi setiap baris dalam array

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

Keluaran:

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. Cari File Teks Di Mana Dua Kata Berbeda Ada (Urutan apa saja, Baris Apa Saja)?

  2. Bergabung dengan banyak bidang dalam file teks di Unix

  3. Pencarian dan penggantian rekursif dalam file teks di Mac dan Linux

  1. Cara Menggunakan Perintah Grep untuk Menemukan Teks di File

  2. Cara Menggabungkan Dua File Teks di Linux

  3. Cara mempercepat pencarian pada banyak koleksi file teks (1TB)

  1. Bagaimana cara menemukan file di Ubuntu?

  2. Cari File Dengan Gui?

  3. Cari Direktori Untuk File Dan Hasil Output Ke File Teks?