こんにちは。現役エンジニアの”はやぶさ”@Cpp_Learningです。全文検索エンジンや検索システムに興味があって勉強中です。
実践を兼ねた勉強として、Pythonで全文検索アプリを作りました。
Pythonで全文検索アプリつくりました。 pic.twitter.com/iatlPbZfYH
— はやぶさ@技術ノート (@Cpp_Learning) October 31, 2021
作り方などの備忘録として本記事を書きます。
Contents
対象読者
本記事の対象読者は以下の通りです。
- 全文検索に興味がある人(入門したい人)
- 全文検索サーバの Fess について知りたい人
- Pythonライブラリの Streamlit で Web アプリを作りたい人
- Fess のAPIと Streamlit で作ったUIによる全文検索アプリを作りたい人
特に最後の項目が本記事のゴールなので、最後まで読めばPythonで全文検索アプリを作れるようになります。
全文検索とは
全文検索について、Wikipediaでは下記のように説明しています。
全文検索とは、コンピュータにおいて、複数の文書(ファイル)から特定の文字列を検索すること。「ファイル名検索」や「単一ファイル内の文字列検索」と異なり、「複数文書にまたがって、文書に含まれる全文を対象とした検索」という意味で使用される。
引用元:Wikipedia
もう少し易しい言葉で説明すると「複数のデータの中」から「入力した検索キーワード」と「一致するワード(文字列)を含むデータ」を探索することです。
全文検索サーバーのFessとは
Fess(フェス)とは 5分で構築できるオープンソースの全文検索サーバー です。魅力的な特徴が沢山ありますが、特に重要なものを以下に列挙します。
- Apache ライセンスなので、個人から商用利用まで無料で自由に使える
- Java 実行環境さえあればどの OS でも動作可能
- 検索エンジンに Elasticsearch を利用
- Web/ファイルシステム/クラウドストレージ/データベースをクロール
- Word/Excel/PowerPoint や PDF など多くのファイル形式に対応
- インデックスを作成できる
- 独自の辞書も作成できる
- JSON APIがあるので、別アプリからFessサーバーの検索機能を活用可能
これで無料とか凄すぎます!
Fessのインストール(環境構築)
Fessの環境構築については、公式サイトで丁寧に説明しているので、手順通りに進めれば問題なくセットアップできます。
Javaをインストール済みの人でも、素直に一番上の手順を参考に(Java関連の部分を読み飛ばしながら)進めるのが良いと思います。
Fessでインデックス作成 -クロール設定-
環境構築が完了したら、Fessを起動して、インデックスを作成します。今回は本サイト「はやぶさの技術ノート」をクロール対象として登録します。
つまり、本サイトの各ページを探索(クロール)し、全文検索の対象として登録(インデックスを作成)します。
クロール完了後、「深層学習」などのキーワードを入力して検索した結果が下図です。
Fessの検索 API
Fessサーバーは 検索API を提供しているため、http://localhost:8080/json/?q=検索語 というリクエストを送ることで、 検索結果をJSON形式で受け取ることができます。
例えば、http://localhost:8080/json/?q=深層学習 でリクエストを送ると、以下のJSONを受け取ることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 |
{ "response": { "version": "13.14", "status": 0, "q": "深層学習", "query_id": "0c36f48f848b469c8538cbbfbc9e80aa", "exec_time": 0.73, "query_time": 137, "page_size": 20, "page_number": 1, "record_count": 231, "record_count_relation": "EQUAL_TO", "page_count": 12, "highlight_params": "&hq=%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92", "next_page": true, "prev_page": true, "start_record_number": 11, "end_record_number": 30, "page_numbers": [ "1", "2", "3", "4", "5", "6" ], "partial": false, "search_query": "深層学習", "requested_time": 1635582046512, "related_query": [], "related_contents": [], "result": [ { "filetype": "html", "title": "機械学習|はやぶさの技術ノート", "content_title": "機械学習|はやぶさの技術ノート", "digest": "機械学習", "host": "cpp-learning.com", "content_length": "100141", "timestamp": "2021-10-29T06:34:06.483Z", "url_link": "https://cpp-learning.com/category/%e6%a9%9f%e6%a2%b0%e5%ad%a6%e7%bf%92/page/5/", "created": "2021-10-29T06:34:06.483Z", "site_path": "cpp-learning.com/category/機械学習/page/5/", "doc_id": "b3c5046ae87b471eb181c46781a1b5ae", "url": "https://cpp-learning.com/category/%e6%a9%9f%e6%a2%b0%e5%ad%a6%e7%bf%92/page/5/", "content_description": " 『<strong>深層学習</strong>による … 機械学習 ONNX RuntimeとYoloV3でリアルタイム物体検出...が専門の”はやぶさ”@Cpp_Learningです。 『<strong>深層学習</strong>による … 機械学習 【NNabla】C++ APIと学習済みモデルによる推論...", "site": "cpp-learning.com/category/機械学習/page/5/", "boost": "1.0", "mimetype": "text/html", "_id": "7ef60b5feb683d6f425e74295da74d30db85c82e9a162d93d081a928274eefdcd848846523499dba1b4c7f1fede2e1a6a362650a812f05618a3f51b72b746268" }, { "filetype": "html", "title": "【技術書典】『秒速DEEP LEARNING』と『図解速習DEEP LEARNING』の感想文|はやぶさの技術ノート", "content_title": "【技術書典】『秒速DEEP LEARNING』と『図解速習DEEP LEARNING』の感想文...", "digest": "こんにちは。 現役エンジニアの”はやぶさ”@Cpp_Learningです。 2018/10/8 体育の日(祝日)に『技術", "host": "cpp-learning.com", "content_length": "125707", "timestamp": "2021-10-29T06:45:22.965Z", "url_link": "https://cpp-learning.com/deep_learning_colaboratory/", "created": "2021-10-29T06:45:22.965Z", "site_path": "cpp-learning.com/deep_learning_colaboratory/", "doc_id": "2d0370aa39cb44a1b72a51ba51536b18", "url": "https://cpp-learning.com/deep_learning_colaboratory/", "content_description": " <strong>深層学習</strong>×画像 <strong>深層学習</strong>×音 <strong>深層学習</strong>×言語 など 『秒速DL』 では、あなたが...見れば見るほど↑の図イイよね! 既に<strong>深層学習</strong>を学んだ人だと↑の図を全て理解できると思う! <strong>深層学習</strong>をこれから勉強したい!という人は...", "site": "cpp-learning.com/deep_learning_colaboratory/", "boost": "1.0", "mimetype": "text/html", "_id": "7ae03e1c1027df29aa2b8842622273e77f9c67201ad379a2ee6223a01c326494bf65233edc2462a328d4f8f5c1d39ad2a3e6be6ce78ced628aca0cb27e835b47" }, { "filetype": "html", "title": "機械学習|はやぶさの技術ノート", "content_title": "機械学習|はやぶさの技術ノート", "digest": "機械学習", "host": "cpp-learning.com", "content_length": "99523", "timestamp": "2021-10-29T06:33:55.825Z", "url_link": "https://cpp-learning.com/category/%e6%a9%9f%e6%a2%b0%e5%ad%a6%e7%bf%92/page/4/", "created": "2021-10-29T06:33:55.825Z", "site_path": "cpp-learning.com/category/機械学習/page/4/", "doc_id": "9aa3beef88264f34b0b21b1416a85378", "url": "https://cpp-learning.com/category/%e6%a9%9f%e6%a2%b0%e5%ad%a6%e7%bf%92/page/4/", "content_description": " 『<strong>深層学習</strong>による … M5Stack <strong>深層学習</strong>×画像処理×M5Stackでアバターアプリを作る...現役エンジニアの”はやぶさ”@Cpp_Learningです。最近は、Pytorchを使って<strong>深層学習</strong>を楽しんでいます。 … 機械学習 PyTorch Lightning入門から実践まで...", "site": "cpp-learning.com/category/機械学習/page/4/", "boost": "1.0", "mimetype": "text/html", "_id": "189f2aaa5ad8696485465f755ee3a0c3e82d52755e33b1703c253534547c3b0c3bc8b6a872d4aa748636f0e47256fdc00dffd1b0396477bc893b05b137d0fd7f" }, { "filetype": "html", "title": "機械学習|はやぶさの技術ノート", "content_title": "機械学習|はやぶさの技術ノート", "digest": "機械学習", "host": "cpp-learning.com", "content_length": "99523", "timestamp": "2021-10-29T08:38:38.588Z", "url_link": "https://cpp-learning.com/category/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92/page/4/", "created": "2021-10-29T08:38:38.588Z", "site_path": "cpp-learning.com/category/機械学習/page/4/", "doc_id": "92ef2a26fb644c99a4c1f182ece86370", "url": "https://cpp-learning.com/category/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92/page/4/", "content_description": " 『<strong>深層学習</strong>による … M5Stack <strong>深層学習</strong>×画像処理×M5Stackでアバターアプリを作る...現役エンジニアの”はやぶさ”@Cpp_Learningです。最近は、Pytorchを使って<strong>深層学習</strong>を楽しんでいます。 … 機械学習 PyTorch Lightning入門から実践まで...", "site": "cpp-learning.com/category/機械学習/page/4/", "boost": "1.0", "mimetype": "text/html", "_id": "583564a59909346061f2377806e1a3bf7129a11b953c904484f299ff6e12f8964f474c3c620e6db7df819ba2b858f2847c30c8971dd8a33169a5442858a4afe0" }, { "filetype": "others", "title": "embed", "content_title": "embed", "digest": "1.0 1.0はやぶさの技術ノートhttps://cpp-learning.comhayabusahttps://cpp-learning.com/author/hayabusa/【深層学習入門】超実践!Chainerと深層学習でシステム解析する方法rich600338wp-embedded-content https://cpp-learning.com/deep-learning_ana...", "host": "cpp-learning.com", "content_length": "3357", "timestamp": "2021-10-29T07:55:58.401Z", "url_link": "https://cpp-learning.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fcpp-learning.com%2Fdeep-learning_analysis%2F&format=xml", "created": "2021-10-29T07:55:58.401Z", "site_path": "cpp-learning.com/wp-json/oembed/1.0/embed", "doc_id": "cb4b3708ecd144ee805da12bd382212c", "url": "https://cpp-learning.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fcpp-learning.com%2Fdeep-learning_analysis%2F&format=xml", "content_description": "/author/hayabusa/【<strong>深層学習</strong>入門】超実践!Chainerと<strong>深層学習</strong>でシステム解析する方法rich6003...arning_analysis/ 【<strong>深層学習</strong>入門】超実践!Chainerと<strong>深層学習</strong>でシステム解析する方法 // /*! This...", "site": "cpp-learning.com/wp-json/oembed/1.0/embed", "filename": "embed", "boost": "1.0", "mimetype": "text/xml", "_id": "cc8b61a04cda7b70a6b26765dbd06d3c9b3bad9daec9474ff3db584aba2b3bb15d8f542e7b926de3af978152d031c54209b36c4861c907a5a600d6f5bbc91c7b" }, { "filetype": "html", "title": "【NNabla】Python CLIでニューラルネットワークの構造を可視化する|はやぶさの技術ノート", "content_title": "【NNabla】Python CLIでニューラルネットワークの構造を可視化する|はやぶさの技術ノート", "digest": "直観的にニューラルネットワークの実装ができるソニー製の深層学習フレームワーク”Neural Network Libraries”のCommand Line Interfaceを使ってNNPファイルに保存されたニューラルネットワークの構造を描画します。", "host": "cpp-learning.com", "content_length": "102936", "timestamp": "2021-10-29T07:41:00.477Z", "url_link": "https://cpp-learning.com/nnabla_python-cli/", "created": "2021-10-29T07:41:00.477Z", "site_path": "cpp-learning.com/nnabla_python-cli/", "doc_id": "5128904de601434fa4ee4847823adfa5", "url": "https://cpp-learning.com/nnabla_python-cli/", "content_description": " 前回、Sony製の<strong>深層学習</strong>フレームワーク “Neural Network Libraries(NNabla)”...-HDF5ファイル編- 直観的にニューラルネットワークの実装ができるソニー製の<strong>深層学習</strong>フレームワーク”NNL”によるDeep Learning...", "site": "cpp-learning.com/nnabla_python-cli/", "boost": "1.0", "mimetype": "text/html", "_id": "46e9b04c4c0af2f4b0f494d4a4f3030e4176f82ab3ef66094503aab4b895b61007ee7026409a2dd3c08a872e6156a1ac8988260ce7a4a0448d3f97b060ca899d" }, { "filetype": "html", "title": "機械学習|はやぶさの技術ノート", "content_title": "機械学習|はやぶさの技術ノート", "digest": "機械学習", "host": "cpp-learning.com", "content_length": "100271", "timestamp": "2021-10-29T08:39:00.678Z", "url_link": "https://cpp-learning.com/category/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92/page/6/", "created": "2021-10-29T08:39:00.678Z", "site_path": "cpp-learning.com/category/機械学習/page/6/", "doc_id": "372ff26c29f84966bae4e6074e1eadba", "url": "https://cpp-learning.com/category/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92/page/6/", "content_description": " と思っている人の … 機械学習 【<strong>深層学習</strong>入門】超実践!Chainerと<strong>深層学習</strong>でシステム解析する方法 2018年8月1日...が専門の”はやぶさ”@Cpp_Learningです。 『<strong>深層学習</strong>による … 書評 【技術書典】『秒速DEEP LEARNING』と『図解速習DEEP...", "site": "cpp-learning.com/category/機械学習/page/6/", "boost": "1.0", "mimetype": "text/html", "_id": "a51b15972643b62e4a8acdc9515dc0aedff1b5e3360354d9a7f5e8d0ae48bf990cd4cd94f77c08d97125a2f6ef3503731a69bf1ff7781f2d12351be8976b20d2" }, { "filetype": "html", "title": "【Anaconda】超簡単!オフラインで機械学習の環境構築をする方法|はやぶさの技術ノート", "content_title": "【Anaconda】超簡単!オフラインで機械学習の環境構築をする方法|はやぶさの技術ノート", "digest": "機械学習(深層学習含む)の環境をオフラインで構築する方法を説明します。Anacondaの仮想環境を使用することで簡単に実施できます。今回はWindowsを例に説明しますが、Linuxでも同様の方法で実施可能です。", "host": "cpp-learning.com", "content_length": "114831", "timestamp": "2021-10-29T07:29:12.220Z", "url_link": "https://cpp-learning.com/offline_machine_learnig/", "created": "2021-10-29T07:29:12.220Z", "site_path": "cpp-learning.com/offline_machine_learnig/", "doc_id": "08c4c2aa33c142148b4e4f4e0edadc96", "url": "https://cpp-learning.com/offline_machine_learnig/", "content_description": " 【<strong>深層学習</strong>入門】超実践!Chainerと<strong>深層学習</strong>でシステム解析する方法 ディープラーニ...上げました。制御・解析・分析などの課題解決に<strong>深層学習</strong>を使いたい人や、<strong>深層学習</strong>をビジネスや研究で使い人にオススメの記事です。......", "site": "cpp-learning.com/offline_machine_learnig/", "boost": "1.0", "mimetype": "text/html", "_id": "1be922ea3914b8e10104715462f08ad1bae394b33a6e2caef8398cbdcbe4890d05349d879abeedccd29865c9ca9f5c4669784b1f63a8b5bbc6a33beefb99d05b" }, { "filetype": "html", "title": "はやぶさの技術ノート|理系に役立つ情報", "content_title": "はやぶさの技術ノート|理系に役立つ情報", "digest": "仕事効率化 【仕事効率化】全ての人に教えたい!Visual Stud... M5Stack 【M5Stack入門】初心者におすすめしたい情報まとめ 機械学習 PyTorch Lightning入門から実践まで -自... 機械学習 【...", "host": "cpp-learning.com", "content_length": "183112", "timestamp": "2021-10-29T06:44:16.117Z", "url_link": "https://cpp-learning.com/page/7/", "created": "2021-10-29T06:44:16.117Z", "site_path": "cpp-learning.com/page/7/", "doc_id": "9043cf8cafe74d3d98b05b6981218dc8", "url": "https://cpp-learning.com/page/7/", "content_description": " 『<strong>深層学習</strong>による … M5Stack <strong>深層学習</strong>×画像処理×M5Stackでアバターアプリを作る...【Pyxel】Pythonでレトロゲームを作ろう! 総集... 機械学習 【<strong>深層学習</strong>入門】画像処理の基礎(画素操作)からCNN設計... 機械学習...", "site": "cpp-learning.com/page/7/", "boost": "1.0", "mimetype": "text/html", "_id": "521e7ad74a73df8670ccaa8f632acc832b12bff835f08b34dc974afc4f448764a1bf24fe1e646d3da8e8c0ed15282ab7a039ec423e6dce38adcd35ee227427e7" }, { "filetype": "html", "title": "はやぶさの技術ノート|理系に役立つ情報", "content_title": "はやぶさの技術ノート|理系に役立つ情報", "digest": "仕事効率化 【仕事効率化】全ての人に教えたい!Visual Stud... M5Stack 【M5Stack入門】初心者におすすめしたい情報まとめ 機械学習 PyTorch Lightning入門から実践まで -自... 機械学習 【...", "host": "cpp-learning.com", "content_length": "183648", "timestamp": "2021-10-29T06:53:29.375Z", "url_link": "https://cpp-learning.com/page/8/", "created": "2021-10-29T06:53:29.375Z", "site_path": "cpp-learning.com/page/8/", "doc_id": "a63577b39c6e4ac1b3175239ff782b4f", "url": "https://cpp-learning.com/page/8/", "content_description": " 『<strong>深層学習</strong>による … M5Stack <strong>深層学習</strong>×画像処理×M5Stackでアバターアプリを作る...【Pyxel】Pythonでレトロゲームを作ろう! 総集... 機械学習 【<strong>深層学習</strong>入門】画像処理の基礎(画素操作)からCNN設計... 機械学習...", "site": "cpp-learning.com/page/8/", "boost": "1.0", "mimetype": "text/html", "_id": "24bff80e5ea689c19414d2fbaa60ee72a53f901669087f429046ec73fd3445e5dad16cc46300ca1d6ce1a2eda671aef7a88cbc820aa2373f64439f5449c444f7" }, { "filetype": "html", "title": "【NNabla】Neural Network Librariesの使い方まとめ|はやぶさの技術ノート", "content_title": "【NNabla】Neural Network Librariesの使い方まとめ|はやぶさの技術ノート", "digest": "こんにちは。 ディープラーニングお兄さんの”はやぶさ”@Cpp_Learningです。 仕事・プライベートどちらでも”深", "host": "cpp-learning.com", "content_length": "109505", "timestamp": "2021-10-29T07:06:12.551Z", "url_link": "https://cpp-learning.com/nnabla_tips/", "created": "2021-10-29T07:06:12.551Z", "site_path": "cpp-learning.com/nnabla_tips/", "doc_id": "5a063a8b610a497dad0984ed55347e97", "url": "https://cpp-learning.com/nnabla_tips/", "content_description": "※PythonだけでなくC++で<strong>深層学習</strong>を使いたい人向けの記事 スポンサーリンク 【<strong>深層学習</strong>入門】実践!NNablaで学習から推論まで...※本記事でChainer版の<strong>深層学習</strong>チュートリアルも紹介しています 学習済みモデルを使って推論する方法 -HDF5ファイル編- <strong>深層学習</strong>チュートリアル記事で生成した...", "site": "cpp-learning.com/nnabla_tips/", "boost": "1.0", "mimetype": "text/html", "_id": "584959a4c02e7b7478bf795ff4cd51de9e423dbe635cd7afcbbe8dfae7aee819a6ec1838cd2f91be98f9b5d1186211fbf933f37e3b9d067209329589c6bb0826" }, { "filetype": "html", "title": "はやぶさの技術ノート|理系に役立つ情報", "content_title": "はやぶさの技術ノート|理系に役立つ情報", "digest": "仕事効率化 【仕事効率化】全ての人に教えたい!Visual Stud... M5Stack 【M5Stack入門】初心者におすすめしたい情報まとめ 機械学習 PyTorch Lightning入門から実践まで -自... 機械学習 【...", "host": "cpp-learning.com", "content_length": "183580", "timestamp": "2021-10-29T07:53:41.947Z", "url_link": "https://cpp-learning.com/page/10/", "created": "2021-10-29T07:53:41.947Z", "site_path": "cpp-learning.com/page/10/", "doc_id": "ed8eb4c28ce846859bffe7d57580e429", "url": "https://cpp-learning.com/page/10/", "content_description": " 『<strong>深層学習</strong>による … M5Stack <strong>深層学習</strong>×画像処理×M5Stackでアバターアプリを作る...【Pyxel】Pythonでレトロゲームを作ろう! 総集... 機械学習 【<strong>深層学習</strong>入門】画像処理の基礎(画素操作)からCNN設計... 機械学習...", "site": "cpp-learning.com/page/10/", "boost": "1.0", "mimetype": "text/html", "_id": "aa8ae90aaf045ff641a4efbd6e6b9be0e9a4ee78816fc068472ab95e0aeb67f556bc76c5338e7eaf4ae8d685d9898880661cd24b07e2ef4f44cfe02169cb283c" }, { "filetype": "others", "title": "embed", "content_title": "embed", "digest": "1.0 1.0はやぶさの技術ノートhttps://cpp-learning.comhayabusahttps://cpp-learning.com/author/hayabusa/【深層学習入門】画像処理の基礎(画素操作)からCNN設計までrich600338wp-embedded-content https://cpp-learning.com/operate_pixel/ 【深層学習入門...", "host": "cpp-learning.com", "content_length": "3246", "timestamp": "2021-10-29T06:45:12.061Z", "url_link": "https://cpp-learning.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fcpp-learning.com%2Foperate_pixel%2F&format=xml", "created": "2021-10-29T06:45:12.061Z", "site_path": "cpp-learning.com/wp-json/oembed/1.0/embed", "doc_id": "bc4f09e0e17d440a9fc60719b7e60fa9", "url": "https://cpp-learning.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fcpp-learning.com%2Foperate_pixel%2F&format=xml", "content_description": "com/author/hayabusa/【<strong>深層学習</strong>入門】画像処理の基礎(画素操作)からCNN設計までric...https://cpp-learning.com/operate_pixel/ 【<strong>深層学習</strong>入門】画像処理の基礎(画素操作)からCNN設計まで //...", "site": "cpp-learning.com/wp-json/oembed/1.0/embed", "filename": "embed", "boost": "1.0", "mimetype": "text/xml", "_id": "3232853dbd31fd6b3b64bcbd2128385a7827c781b3068971067c10b32347ef440dcfce1546967f2d4e332a6334e4ee82d5986d751e6cbb546d5ccc522baf9ea1" }, { "filetype": "others", "title": "embed", "content_title": "embed", "digest": "1.0 1.0はやぶさの技術ノートhttps://cpp-learning.comhayabusahttps://cpp-learning.com/author/hayabusa/深層学習×画像処理×M5Stackでアバターアプリを作る -AIアプリ開発チュートリアル-rich600338wp-embedded-content https://cpp-learning.com/mxnet_m...", "host": "cpp-learning.com", "content_length": "3455", "timestamp": "2021-10-29T07:04:35.948Z", "url_link": "https://cpp-learning.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fcpp-learning.com%2Fmxnet_m5stack%2F&format=xml", "created": "2021-10-29T07:04:35.948Z", "site_path": "cpp-learning.com/wp-json/oembed/1.0/embed", "doc_id": "1071e74afb624b819d9a049c29faa3cc", "url": "https://cpp-learning.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fcpp-learning.com%2Fmxnet_m5stack%2F&format=xml", "content_description": "com/author/hayabusa/<strong>深層学習</strong>×画像処理×M5Stackでアバターアプリを作る -AI...https://cpp-learning.com/mxnet_m5stack/ <strong>深層学習</strong>×画像処理×M5Stackでアバターアプリを作る -AIアプリ開発チュートリアル-...", "site": "cpp-learning.com/wp-json/oembed/1.0/embed", "filename": "embed", "boost": "1.0", "mimetype": "text/xml", "_id": "5ff2c3863864601d24c71ff0004b0a3703dfbcf136ba7a9a9b4330cf2201a82d6fe181e7ecd810d6c953044113fb260e1514f4c102f1a6a90335fb150a2fa6c1" }, { "filetype": "others", "title": "embed", "content_title": "embed", "digest": "1.0 1.0はやぶさの技術ノートhttps://cpp-learning.comhayabusahttps://cpp-learning.com/author/hayabusa/【深層学習入門】超実践!ChainerのDefine by Runで動的ニューラルネットワーク設計rich600338wp-embedded-content https://cpp-learning.com/cha...", "host": "cpp-learning.com", "content_length": "3421", "timestamp": "2021-10-29T07:39:24.207Z", "url_link": "https://cpp-learning.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fcpp-learning.com%2Fchainer_define-by-run%2F&format=xml", "created": "2021-10-29T07:39:24.207Z", "site_path": "cpp-learning.com/wp-json/oembed/1.0/embed", "doc_id": "9ce50b8137364430a925881522b83abd", "url": "https://cpp-learning.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fcpp-learning.com%2Fchainer_define-by-run%2F&format=xml", "content_description": "com/author/hayabusa/【<strong>深層学習</strong>入門】超実践!ChainerのDefine by Run...com/chainer_define-by-run/ 【<strong>深層学習</strong>入門】超実践!ChainerのDefine by Runで動的ニューラルネットワーク設計...", "site": "cpp-learning.com/wp-json/oembed/1.0/embed", "filename": "embed", "boost": "1.0", "mimetype": "text/xml", "_id": "8a07e73b8f5b2946caf11bfd6081866a15dd59c5f94713912ef02b48f8750e9e4568241a9c82df252969bcabe5685371c7d2968b79838feb95ae7e5203c34437" }, { "filetype": "html", "title": "機械学習|はやぶさの技術ノート", "content_title": "機械学習|はやぶさの技術ノート", "digest": "機械学習", "host": "cpp-learning.com", "content_length": "100271", "timestamp": "2021-10-29T06:33:34.529Z", "url_link": "https://cpp-learning.com/category/%e6%a9%9f%e6%a2%b0%e5%ad%a6%e7%bf%92/page/6/", "created": "2021-10-29T06:33:34.529Z", "site_path": "cpp-learning.com/category/機械学習/page/6/", "doc_id": "b4ff93d563434e268072e0f19905f77d", "url": "https://cpp-learning.com/category/%e6%a9%9f%e6%a2%b0%e5%ad%a6%e7%bf%92/page/6/", "content_description": " と思っている人の … 機械学習 【<strong>深層学習</strong>入門】超実践!Chainerと<strong>深層学習</strong>でシステム解析する方法 2018年8月1日...が専門の”はやぶさ”@Cpp_Learningです。 『<strong>深層学習</strong>による … 書評 【技術書典】『秒速DEEP LEARNING』と『図解速習DEEP...", "site": "cpp-learning.com/category/機械学習/page/6/", "boost": "1.0", "mimetype": "text/html", "_id": "0a4b9236a9ac577ed88de1efcdccd49d1d5db07bf46e960f72ec76e4f56decda5e9cf4120fb2874990820b540adcc325da02e782cb1cbc998b9b30152d6e0c95" }, { "filetype": "html", "title": "はやぶさの技術ノート|理系に役立つ情報", "content_title": "はやぶさの技術ノート|理系に役立つ情報", "digest": "仕事効率化 【仕事効率化】全ての人に教えたい!Visual Stud... M5Stack 【M5Stack入門】初心者におすすめしたい情報まとめ 機械学習 PyTorch Lightning入門から実践まで -自... 機械学習 【...", "host": "cpp-learning.com", "content_length": "183463", "timestamp": "2021-10-29T07:03:09.687Z", "url_link": "https://cpp-learning.com/page/13/", "created": "2021-10-29T07:03:09.687Z", "site_path": "cpp-learning.com/page/13/", "doc_id": "159fd9a7cc6f4f6684090f2328cc6835", "url": "https://cpp-learning.com/page/13/", "content_description": " と思っている人の … 機械学習 【<strong>深層学習</strong>入門】超実践!Chainerと<strong>深層学習</strong>でシステム解析する方法 2018年8月1日...”@Cpp_Learningです。 『<strong>深層学習</strong>による … M5Stack <strong>深層学習</strong>×画像処理×M5Stackでアバターアプリを作る...", "site": "cpp-learning.com/page/13/", "boost": "1.0", "mimetype": "text/html", "_id": "10bbc0e475f008a6f82269461aa6916825e613549fad3a4b3957b20d3fb27b42cfeb2acca292d9d9392e2c0e1742774e48de007ee9d9dc13ed014ced30a64eba" }, { "filetype": "html", "title": "TensorFlowの学習済みモデルを変換してONNXRuntimeで物体検出|はやぶさの技術ノート", "content_title": "TensorFlowの学習済みモデルを変換してONNXRuntimeで物体検出|はやぶさの技術ノート", "digest": "こんにちは。 コンピュータビジョン(『ロボットの眼』開発)が専門の”はやぶさ”@Cpp_Learningです。 前回『O", "host": "cpp-learning.com", "content_length": "204211", "timestamp": "2021-10-27T15:08:11.272Z", "url_link": "https://cpp-learning.com/tensorflow_onnxruntime/", "created": "2021-10-27T15:08:11.272Z", "site_path": "cpp-learning.com/tensorflow_onnxruntime/", "doc_id": "ac68ace330b346aebe3dd0d9321b4195", "url": "https://cpp-learning.com/tensorflow_onnxruntime/", "content_description": "ONNXおよびONNXRuntimeとは 3 <strong>深層学習</strong>のフェーズ -学習と推論- 3.1 <strong>深層学習</strong>の実践フロー 4 TensorFlowモデルをONNXに変換...をオススメします! スポンサーリンク <strong>深層学習</strong>のフェーズ -学習と推論- <strong>深層学習</strong>を実践する場合、 【学習フェーズ】・【推論フェーズ】...", "site": "cpp-learning.com/tensorflow_onnxruntime/", "boost": "1.0", "mimetype": "text/html", "_id": "e56cad59808e150d286a2e4da0076154fa90609b0f38e50a9c1837964cd68d7cbf22e5a4d851cd4671347b0e92f215ea15cd706741fb1e2bf4236f1e5509a7b2" }, { "filetype": "others", "title": "embed", "content_title": "embed", "digest": "1.0 1.0はやぶさの技術ノートhttps://cpp-learning.comhayabusahttps://cpp-learning.com/author/hayabusa/深層学習による画像処理の概要からChainerCVとFCISで『物体検出ソフト』を作るまでrich600338wp-embedded-content https://cpp-learning.com/chainer...", "host": "cpp-learning.com", "content_length": "3448", "timestamp": "2021-10-29T07:55:47.927Z", "url_link": "https://cpp-learning.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fcpp-learning.com%2Fchainercv_fcis%2F&format=xml", "created": "2021-10-29T07:55:47.927Z", "site_path": "cpp-learning.com/wp-json/oembed/1.0/embed", "doc_id": "3c4b41105f5346269c18539997116f25", "url": "https://cpp-learning.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fcpp-learning.com%2Fchainercv_fcis%2F&format=xml", "content_description": "com/author/hayabusa/<strong>深層学習</strong>による画像処理の概要からChainerCVとFCISで『...https://cpp-learning.com/chainercv_fcis/ <strong>深層学習</strong>による画像処理の概要からChainerCVとFCISで『物体検出ソフト』を作るまで...", "site": "cpp-learning.com/wp-json/oembed/1.0/embed", "filename": "embed", "boost": "1.0", "mimetype": "text/xml", "_id": "3637105654895b557ca763f1e641fc44b4245e0f99429149c2b32f91c54260100fa7b6e5747a7d8851409e26da17c195112ac5f474a0515ecae8403b835b12b7" }, { "filetype": "html", "title": "はやぶさの技術ノート|理系に役立つ情報", "content_title": "はやぶさの技術ノート|理系に役立つ情報", "digest": "仕事効率化 【仕事効率化】全ての人に教えたい!Visual Stud... M5Stack 【M5Stack入門】初心者におすすめしたい情報まとめ 機械学習 PyTorch Lightning入門から実践まで -自... 機械学習 【...", "host": "cpp-learning.com", "content_length": "182649", "timestamp": "2021-10-27T15:03:46.821Z", "url_link": "https://cpp-learning.com/page/3/", "created": "2021-10-27T15:03:46.821Z", "site_path": "cpp-learning.com/page/3/", "doc_id": "3bec021a59ac4d95ad1593a69f964293", "url": "https://cpp-learning.com/page/3/", "content_description": " 『<strong>深層学習</strong>による … M5Stack <strong>深層学習</strong>×画像処理×M5Stackでアバターアプリを作る...【Pyxel】Pythonでレトロゲームを作ろう! 総集... 機械学習 【<strong>深層学習</strong>入門】画像処理の基礎(画素操作)からCNN設計... 機械学習...", "site": "cpp-learning.com/page/3/", "boost": "1.0", "mimetype": "text/html", "_id": "8db8c02a5ad76d4345a4a50744d32b23e7dc405ecefa72d6e9202bb38052db970db0d70159e31b3be29ce475788d940ce30792ca00a7f827aeaa46dc032d9fde" } ] } } |
このJSON APIを活用し、Webアプリなどからリクエストを投げ、JSONでレスポンスを受け取ることで、オリジナルの全文検索アプリを作成できます。
localhost:8080 の部分はFessサーバーのアドレスが入ります。
Streamlitとは
StreamlitとはPythonソースコードのみでWebアプリを開発できるライブラリです。フロントエンドの開発経験不要で、素早くプロトタイプを作成できることを売りにしています。
以下のコマンドで簡単にインストールできます。
pip install streamlit
公式サイトに豊富なサンプルや丁寧なAPIリファレンスがあるので、「やりたいこと」を直ぐに実現できます。
Pythonで全文検索アプリをつくる
今回つくった全文検索アプリ(Streamlit製Webアプリ)のソースコード(app.py)が以下です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# import requests import httpx import streamlit as st def view_response(res): '''検索クエリ結果の表示''' # ステータスチェック if res["response"]["status"] != 0: st.error("検索中に問題が発生しました。管理者にご相談ください。") # 検索ヒット件数 record_count = res["response"]["record_count"] # 検索ワード q = res["response"]["q"] if record_count == 0: # 検索結果がない場合 st.error(f'{q}に一致する情報は見つかりませんでした。') else: # 検索件数など page_number = res["response"]["page_number"] startRange = res["response"]["start_record_number"] endRange = res["response"]["end_record_number"] exec_time = res["response"]["exec_time"] # "q" の検索結果 232 件中 1 - 10 件目 (0.2 秒) st.write( f" **{q}** の検索結果 **{record_count}** 件中 **{startRange} - {endRange}** 件目 ({exec_time}秒)") # 検索結果表示処理 results = res["response"]["result"] for i, result in enumerate(results): # 検索結果 title = result["title"] url_link = result["url_link"] digest = result["digest"] st.markdown(f"#### {i+1}. [{title}]({url_link})", unsafe_allow_html=True) st.markdown("") # 改行 st.markdown(digest) # nページ目 st.markdown(f"{page_number}ページ目") return page_number, endRange def query_ui(): '''検索クエリ用UI''' # 検索ワード入力 input_word = st.text_input(label='キーワード入力', value='') st.write(f'検索ワード: {input_word}') # 検索件数 page_size = st.sidebar.number_input(label='件数', value=10, step=10) st.sidebar.write(f'件数: {page_size}') # 開始する件数位置 start_record_number = st.sidebar.number_input( label='開始する件数位置', value=0, step=10) st.sidebar.write(f'開始する件数位置: {start_record_number}') return input_word, page_size, start_record_number def main(): '''全文検索アプリ''' # アプリ名 st.markdown('## 全文検索アプリ') # 検索クエリ input_word, page_size, start_record_number = query_ui() # 検索 if st.button("検索"): # GETリクエスト response = httpx.get( f'http://localhost:8080/json/?q={input_word}&num={page_size}&start={start_record_number}') # response = requests.get( # f'http://localhost:8080/json/?q={input_word}&num={page_size}&start={start_record_number}') # 検索結果をJSONで受け取る res = response.json() # 検索結果の表示処理 view_response(res) # 検索結果詳細 with st.expander("検索結果詳細 for debug"): st.json(res) if __name__ == '__main__': main() |
以下のコマンドでアプリを起動後、http://localhost:8501 にアクセスすれば全文検索できます。
streamlit run app.py
自作Webアプリで全文検索している様子が以下です。
Pythonで全文検索アプリつくりました。 pic.twitter.com/iatlPbZfYH
— はやぶさ@技術ノート (@Cpp_Learning) October 31, 2021
※冒頭と同じ動画です。
【おまけ】PythonのHTTPリクエスト用ライブラリどれ使う?
PythonのHTTPクライアント用ライブラリだと、Requests と HTTPX が有名どころですが、どっちを使っている人が多いか気になったので、簡単なアンケート調査をしました。
PythonのHTTPクライアント用ライブラリって今どきはHTTPXを使うのかな🤔
皆さんが普段使っているライブラリはどっちですか?
— はやぶさ@技術ノート (@Cpp_Learning) October 23, 2021
結果は上記の通り、Requests を使う人の方が多いようです。ただ、後発のHTTPXの方が機能が充実しているので、今後はHTTPXを積極的に使っていこうと思います。
まとめ -Pythonで全文検索アプリをつくる-
全文検索サーバーのFessとPythonライブラリのStreamlitを活用し、Pythonで全文検索アプリを作りました。
Pythonに拘った理由は、今回つくったWebアプリに以下の機能を追加する際、Pythonライブラリを活用するのが近道だと思ったからです。
- 同義語検索
- 類義語検索
- 機械学習による自然言語処理
アプリ作り楽しいので、今からワクワクしてます。
検索技術や自然言語処理の勉強を始めたばかりですが、今後も勉強した内容を本ブログで公開したいと考えています。
今後もブログ「はやぶさの技術ノート」をよろしくお願いします。