GNU/Linux >> Linux の 問題 >  >> Linux

600,000 以上のファイルでの高速テキスト検索

簡単に言えば、検索を実行するたびに 60 万件のドキュメントをすばやく開いたり、検索したり、閉じたりする方法はありません。 「1分以上」のベンチマークは、おそらく単一のテストアカウントを使用しています。マルチユーザー Web サイトでこれらを検索する予定がある場合は、すぐに忘れてしまいます。disk IO チャートから外れて、サーバー全体をブロックします.

したがって、唯一のオプションは、すべてのファイルにインデックスを付けることです。他のすべてのクイック検索ユーティリティと同じように。コメントに記載されているように Solr または ElasticSearch を使用するか、独自のものを構築するかは関係ありません。ファイルは索引付けされます。

txt を考慮する ファイルは pdf のテキスト バージョンです 受け取ったファイルの場合、最も簡単な解決策は、テキストをファイルではなくデータベースに書き込むことだと思います。いずれにせよ、それ以上のディスク容量は必要ありません.

次に、full text search を有効にします。 データベース (mysqlmssql および他の人がそれをサポートしています)、応答時間が大幅に改善されると確信しています。これらの indexes を作成することに注意してください ストレージ スペースが必要ですが、他のソリューションでも同じことが言えます。

本当にスピードアップしたい場合は、履歴書をより詳細なレベルで解析してみてください。場所、教育、話されている言語、および定期的に検索するその他の情報を取得して、それらを別の表/列に入れてみてください。これは非常に困難な作業であり、ほとんど単独でのプロジェクトですが、価値のある検索結果が必要な場合は、これが最適です。コンテキストなしでテキストを検索すると、非常に異なる結果が得られるため、「ニューヨーク」の例を考えてみてください:

<オール>
  • 私はニューヨークに住んでいます
  • ニューヨーク大学で学びました
  • 自己紹介でアリシア・キーズの「ニューヨーク」という曲が大好きです
  • New York Pizza で働いていました
  • 私はイギリスのニューヨークシャーで生まれました
  • 夏の間、ニューヨーク テリアの繁殖に取り組みました。

  • 深入りはしませんが、概念実証を作成するためのガイドラインを提供しようと思います。

    1

    最初にここからエラスティック検索をダウンロードして抽出します:https://www.elastic.co/downloads/elasticsearch そしてそれを実行します:

    bin/elasticsearch
    

    2

    https://github.com/dadoonet/fscrawler#download-fsrawler をダウンロードして解凍し、実行します:

    bin/fscrawler myCustomJob
    

    次に停止して (Ctrl-C)、編集します。 対応する myCustomJob/_settings.json (これは自動的に作成され、コンソールにパスが出力されました)。
    プロパティを編集できます:"url" (スキャンするパス),"update_rate" (1m にすることができます ),"includes" (例:["*.pdf","*.doc","*.txt"] )、"index_content" (ファイル名のみにとどまるには、falseにします)。

    もう一度実行:

    bin/fscrawler myCustomJob
    

    注:インデックス作成は後でコードを使用して実行する必要があるかもしれませんが、今のところは fscrawler を使用して自動的に実行されます。 、elastic と直接やり取りします。

    3

    "url" で指定したディレクトリにファイルを追加し始めます。

    4

    高度なレスト クライアントをダウンロード クロムの場合、次の POST を作成します :

    URL:http://localhost:9200/_search

    生のペイロード:

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

    一致したファイルのリストが返されます。注:fscrawler キーの下のファイル名にインデックスを付けています:file.filename .

    5

    現在、高度なレスト クライアントを使用する代わりに このクエリを実行するには、PHP を使用できます。上記の URL への REST 呼び出しによって、または php-client API を利用することによって:https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/_search_operations.html

    同じことがインデックス作成を表します:https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/_indexing_documents.html


    すべてのファイル情報をデータベースに保存する場合:

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

    配列内のすべての行を実行できるようになりました

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

    出力:

    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. Grepコマンドを使用してファイル内のテキストを検索する方法

    2. PythonでMSワードファイルからテキストを抽出する

    3. SSH 経由でデバイスを使用しますか?

    1. Linuxで2つのテキストファイルを結合する方法

    2. Ubuntuでファイルを見つける方法は?

    3. 2つの異なる単語が存在するテキストファイルを検索しますか(任意の順序、任意の行)?

    1. GUIでファイルを検索しますか?

    2. ディレクトリでファイルを検索し、結果をテキストファイルに出力しますか?

    3. Unix でテキスト ファイル内の複数のフィールドを結合する