ホームページ >バックエンド開発 >Golang >あなたの検索エンジン、Zensearch

あなたの検索エンジン、Zensearch

Barbara Streisand
Barbara Streisandオリジナル
2024-11-06 12:05:02750ブラウズ

Your search engine, Zensearch

ザ・ベニング

反応アプリケーションの構築から、インデックス作成用の独自の検索エンジンと Web クローラーの構築まで。 Zensearch をご紹介できることをうれしく思います。Zensearch は、ユーザーとして検索内容をより詳細に制御でき、さまざまな Web サイトをクロールするためのエントリを作成し、既存の検索エンジン機能を引き続き使用できる検索エンジンです。作業中にデータベース内のデータにインデックスを付けます。これが Google や Brave Search のような世界で最も複雑または洗練された検索エンジンではないことはわかっていますが、自分でどれだけのことができ、学習できるかを測定するためにこれを構築しました。できる限りのことをやりながら、ああ、たくさんのことを学びました。

すべては、私が React Web アプリケーションを構築していたときに始まりました。これは、著者と会話したり、考えていることを書き留めたりするかのように、お気に入りの引用文を挿入したり、その特定のページにメモを追加したりするための、ある種のありきたりな本です。その瞬間、あなたの物理的な本のページに相当するページ上で、それは悪いプロジェクトではありませんでしたが、Reactjs アプリケーションを構築することにとても飽きてしまいました。それは悪いことではありませんが、これではどこにも進めないように感じました、私がやっていたことに技術的な深みはなく、ReactJs プロジェクトの構築から何も学んでいませんでした。

そこで私はコンピュータ ネットワーキング、オペレーティング システム、コンピュータ アーキテクチャなどについて勉強しようとしました。その後、数か月かけて勉強し、複数のユーザーを処理し、各ユーザーが異なるユーザーに参加できるウェブソケットのような独自のアプリケーション層プロトコルを構築しました。彼らが互いに通信できる部屋や名前空間で、私は恍惚と、生きているとさえ感じました。スレッド、セマフォ、プロセス、メモリ レイアウト、割り込み信号など、コンピューターの仕組みを理解していれば、非常に多くのことができるように感じました。そこで、これらの機能を活用するにはどのようなプロジェクトができるだろうかと考えました。習ったよ?

ああ、ところで私は独学で、オーディン プロジェクトを使ってプログラミングと Web 開発を学んだので、彼らに声をかけてください。彼らは私に独立して勉強する方法を教えてくれて、カリキュラム全体を通してプログラマーと手を繋ぐことを拒否したからです。 .

課題

私は Nodejs を使ってしかプログラミングできませんでした。それが TypeScript と並んで私の糧だったので、Nodejs を使って Web クローラーを構築しました...かなり愚かですよね?つまり、計画は、フロントエンドからソース URL の配列をクロールできるクローラーを作成し、各クローラーがこれらの抽出されたデータをデータベースに送信できるようにすることでした。周知のとおり、Yabascript はシングルスレッドであり、すべての非同期タスクが処理されます。 Yavascript が実行されている環境によって異なります (例: ブラウザーの API、ノード、デノ、ブン、完了)。

つまり、Nodejs を使用してマルチタスク操作を実行することは自殺行為であり、エンコードされる Web ページ オブジェクトを 8 ビット バッファに変換することから始まりましたが、共有配列バッファはデータのため 64 ビット配列バッファしか転送できませんでした。そのため、オフセット パディングを追加して 8 ビット バッファから 64 ビットに変換し、クローラからメイン スレッドにデータを送信した後、64 ビット バッファから 8 ビット バッファに戻し、最後にそれを解析する必要がありました。 vajascript オブジェクト... わぁ、楽しかったです。メッセージを渡す別の方法もありますが、それはクローラー内にあるのと同じデータのコピーをメインスレッドに作成するので、メモリを大量に消費するのでやりたくありませんでした。 .

私はnodejsのアトミックスモジュールを使って競合状態に対処しなければなりませんでしたが、正直言ってそのモジュールがどのように機能するのか今でも理解できず、とてもイライラしたのでGolangに頼らざるを得ませんでした。私はこの言語が大好きです。セマフォや待機グループを使用して、競合状態を処理するスレッドを作成するのはとても簡単です。ミューテックスを使用する必要性はまだありませんが、それを学ぶのが楽しみです。コンテキストを学ぶのは楽しいでしょう。

フロントエンドに移りましょうか?フロントエンドマスターのこの記事を読んだ人はいますか?そのフレームワークは必要ないかもしれません。ReactJ には飽きたと言ったことを覚えていますか?そうですね。このおかげで、再利用性とデータ バインディング メカニズムのおかげで、フレームワークの良さを理解することができました。

フロントエンドについてはあまり詳しく説明したくありませんが、PubSub パターンを使用してデータが変更されたときに UI の変更を更新し、Web コンポーネントとシャドウ dom を使用して再利用可能なコンポーネントであるシャドウ dom を作成しました。 dom ツリー全体から分離されているため、JavaScript とスタイルでアクセスするのは面倒でした。そのため、CSS と DOM API を使用してアクセスすると機能しません。だから、それらが私が抱えた唯一の課題でしたが、楽しかったです。クローラーを Nodejs から Go に移行していました。

考慮すべき事項

プロジェクトを披露することに熱心だったのでまだ実装していない機能がいくつかありますが、それは私にとってはそれほど重要ではありません。たとえこれが進行中のプロジェクトであっても、これは 1 つのプロジェクトではありません。プロジェクトは完了しました。今後も zensearch を改善し続けますので、現時点では不足している重要な点をいくつか示します。

  • フロントエンドでユーザーに表示される、既にインデックス付けされた Web サイトのリストを実装します。

  • 継続のために最後にクロールした Web ページを保存します。

  • クロールのキャンセルを作成しますが、その時点までのインデックス付きページは引き続き保存されます。

  • Rabbitmq のスケーリングに関するメッセージ サイズ制限により、データベースに Rabbitmq で設定されたデフォルト サイズを超えるメッセージが含まれる場合、メッセージ ブローカーがエラーをスローしてクラッシュするため、これを回避するためにウィンドウ フレームを実装してみます。 Web ページの配列がセグメントに分割され、N サイズ (N はウィンドウのサイズ) で検索エンジンに送信されるパイプライン メカニズムを作成することで TCP で使用されるアルゴリズムですが、これについてはまだ考える必要があります。

  • ユーザーがインデックスに登録された Web サイトを削除できるようにします。

エピローグ

私が学んだことや開発の過程のニュアンスについてもっと詳しく書きたいと思いますが、長すぎると思うので、今のところは私の最高のプロジェクトを披露したいと思います。フィードバックをいただければ幸いです時間があれば、Zensearch をより良くするために問題や改善点があれば教えてください。ああ、これはすべてプライムエイジのおかげです。この人が私に物事をより深く掘り下げて基礎を学ぶきっかけを与えてくれました。ターミナルで npm create vite@latest my-vue-app -- --template reverse-ts を実行するだけで、プログラマーとしての自分自身や自分の知っていることについて確かに不安になりましたが、その不安のせいで私は学びました今は新しいことです。私は常にもっと多くのことを学ぶよう努めています。あなたのからのフィードバックから喜んで学びたいと思います。私の ted トークを聞いていただき、ありがとうございます。

Zensearch の Github リポジトリ

以上があなたの検索エンジン、Zensearchの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。