インデックス型全文検索機能の開発進捗【APIの実装】

スポンサーリンク

こちらで書いていたインデックス型全文検索機能の開発について、APIの実装が一通り完了したので進捗報告です。

どのように実装したのか、加えて簡単なcurlを使用した動作確認をしていきたいと思います。

認証機能

認証はBasic認証を使用してログインし、トークンを発行できる仕組みとしました。
トークンはJWTトークンのような電子署名を使用したものではなく、昔ながらのサーバ管理型としています。

リクエストのパラメータとして "expire" や "reuse" を利用する事で再利用や有効期限を設定できます。
Access tokenとRefresh tokenを採用しなかった理由としては、あまり認証に時間をかけたくなかったという理由が大きいです。

トークンの発行

  • command
curl -X POST "http://localhost/user/_authenticate" -H "accept: application/json" -H "Authorization: Basic ZmVhbG9uZUBsb25lc2VjLmNvbTpQQHNzdzByZA==" -H "Content-Type: application/json" -d "{\"expire\":0,\"reuse\":true}"
  • response
"a0231df757ff443abe376ffc20bda3282c01fab5319568bd3692432b181820fc"

Indexの登録機能

インデックスの登録を行います。
登録は非同期となっており、レスポンスはリクエスト受付を意味する "202 Accepted " を返します。

レスポンスでタスクIDを返します。
タスクIDを指定する事で、ステータスの確認やタスクのキャンセルを行う事ができます。
すでに登録されているURLの場合、Indexは更新されます。

Indexの登録

  • command
curl -X POST "http://localhost/index/_regist" -H "accept: application/json" -H "Authorization: Bearer a0231df757ff443abe376ffc20bda3282c01fab5319568bd3692432b181820fc" -H "Content-Type: application/json" -d "{\"url\":\"https://lonesec.com/2020/01/08/user-register-with-fastapi/\"}"
  • response
{
"task_id": "fa5022d75de203d9bbc7aa3fa667f185155f23b1f88d71df144e553f50c62764"
}

登録タスクの確認

  • command
curl -X GET "http://localhost/index/task/fa5022d75de203d9bbc7aa3fa667f185155f23b1f88d71df144e553f50c62764" -H "accept: application/json" -H "Authorization: Bearer a0231df757ff443abe376ffc20bda3282c01fab5319568bd3692432b181820fc"
  • response
{
"task_id": "fa5022d75de203d9bbc7aa3fa667f185155f23b1f88d71df144e553f50c62764",
"status": "completed"
}

登録タスクのキャンセル

  • command
curl -X DELETE "http://localhost/index/task/fa5022d75de203d9bbc7aa3fa667f185155f23b1f88d71df144e553f50c62764" -H "accept: application/json" -H "Authorization: Bearer a0231df757ff443abe376ffc20bda3282c01fab5319568bd3692432b181820fc"

Index検索機能

キーワードを入力しインデックスを検索します。
ヒットした結果を類似度順に返却します。

スクレイピングの方法が良くなく、いらない文言も入ってしまいますがアルゴリズムは定期的に見直していきます。

  • command
curl -X POST "http://localhost/index/_search" -H "accept: application/json" -H "Authorization: Bearer a0231df757ff443abe376ffc20bda3282c01fab5319568bd3692432b181820fc" -H "Content-Type: application/json" -d "{\"keywords\":\"FastAPI 認証\"}"
  • response
{
  "results": [
    {
    "_index": "web_index",
    "_type": "index",
    "_id": "aHR0cHM6Ly9sb25lc2VjLmNvbS8yMDIwLzAxLzA4L3VzZXItcmVnaXN0ZXItd2l0aC1mYXN0YXBpLw==",
    "_score": 3.2640307,
    "_source": {
        "url": "https://lonesec.com/2020/01/08/user-register-with-fastapi/",
        "content": "FastAPIを使用し、Basic認証を実現するための方法を紹介します。\nまず、FastAPIを動作させるためのDockerコンテナと、認証情報を保存しておくためのデータベースコンテナを準備します。\ndocker-composeを実行すると自動的にデータベースが作成されます。\nFastAPIは自動的にプロジェクトを作成する仕組みがないため、自分でファイルを構築していきます。\nPythonのライブラリを管理するために、今回はPipenvを使用します。\nDockerコンテナをビルドするためにDockerfileを作成します。\nFastAPIをプロキシするためのNginxの設定ファイルを作成します。\ndocker-composeは開発モード(ファイルが編集されたら自動で再起動する)で動作するようにしているので、docker-composeでアプリを実行します。\nブラウザから [\n以上で最低限のFastAPIの環境構築は完了です。\n認証機能編\nメールアドレスが公開されることはありません。\nコメント\n名前 \nメールアドレス \nサイト\n \n \n現職はサーバサイドエンジニア。\nTweets by xfealonex"
        }
     }
  ]
}

Indexの削除機能

登録されているインデックスを削除します。
URLを指定する事で削除できます。

Indexの削除

  • command
curl -X DELETE "http://localhost/index/_delete" -H "accept: application/json" -H "Authorization: Bearer a0231df757ff443abe376ffc20bda3282c01fab5319568bd3692432b181820fc" -H "Content-Type: application/json" -d "{\"url\":\"https://lonesec.com/2020/01/08/user-register-with-fastapi/\"}"

Index削除後の検索

  • command
curl -X POST "http://localhost/index/_search" -H "accept: application/json" -H "Authorization: Bearer a0231df757ff443abe376ffc20bda3282c01fab5319568bd3692432b181820fc" -H "Content-Type: application/json" -d "{\"keywords\":\"FastAPI 認証\"}"
  • response
{
"results": []
}

あとがき

APIは一通り動くようになりました。
現在はDocsからOpenAPIを通して実行していますが、この後は画面を作成していきます。
画面はAngularを使用して作成していく予定です。

進捗に関しては、引き続きこちらで展開していきます。

GitHubへの公開

GitHubにコード公開しています。

GitHub - fealone/self_web_indexer: Full-text search API to index web pages by yourself.
Full-text search API to index web pages by yourself. - fealone/self_web_indexer