Obsidianの関連リンクをベクトル検索諦めて全文検索で自動付与

## 経緯
こちらの続きです。

https://qiita.com/shirousuda/items/25f8bb177dcfb045e5ea

- ChatGPTログを加工して、Obsidianの拡張機能のSmart Connectionでノート同士の関連を自動で出してもらったものの、無料の学習済みモデル?でベクトル検索するのは、あまり実用的ではなさそうだった
- 無料版のベクトル検索は進化待ち状態なので、全文検索で関連度出す

## 結果
![graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079551/abf02bca-f2dd-48e1-bf94-f006b20e619e.png)
- Obsidianのグラフにたくさん関連ついた

![relate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079551/7a71d35a-0c5f-4585-921e-509ffcc2ab63.png)
- アンパンマンのノートに関連リンクを自動付与した結果です
- タイトルだけみると微妙な結果に見えますが、結構精度高いです。最後に詳しく書きます

## やること
- Obsidianのノートをelasticsearchに投入する用のjsonに変換する
- elasticsearchにたくさんmore_like_thisクエリを送る
- more_like_thisクエリの結果をつけてObsidianノートにもどす

## 環境
- Windows 11
- Obsidian 
- Docker Desktop 
- python 3.11　
 
## Obsidianのノートをelasticsearchに投入する用のjsonに変換する
- 自前ツールつかいます。Obsidianの非公認プラグインです

https://github.com/shirousuda/obsidian_md2json

- {valutディレクトリ}\.obsidian\plugins\obsidian-md2json ここにmain.jsとmanifest.jsonを配置します
- Obsidianの設定画面→コミュニティプラグインより、Markdown to Json を有効にします
![cfg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079551/0eb3456d-d92e-4daf-800e-6716d01a6e74.png)

- Obsidianを再起動します
- 次のコマンドを実行すると、valutにある全てのマークダウンを対象に処理しますので気を付けてください
- CTL + P でコマンドパレットを開き、Markdown to JSON : Convert all files to JSON を実行します
- ![cmd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079551/a3669f49-b65b-47b1-9f1a-61695a43735d.png)
- 出力が終わるのを待ちます 終わったら右上のほうにConvertedと出ます

![jsonout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079551/d0f53488-cc49-4c15-943f-5d10507d8a5d.png)
- json-output に変換したファイルがでてきます
- CTL + P でコマンドパレットを開き、Markdown to JSON : Create Elasticsearch bulk file を実行します
![blk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079551/43a46521-9f02-48fa-aebc-6b52f98ed3c9.png)
- bulk-json-output に変換したファイルがでてきます

## elasticsearchをdockerで立ち上げる
![dke.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079551/6f739702-3e64-4e2b-9565-bb2498f05d71.png)
- Docker desktop を立ち上げ、elasticsearchと検索して一番上にでてくるイメージを取得します
![9200.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079551/aff7c859-0f2c-4cba-8fed-ec6e1b790569.png)
- Imageからelasticsearchを起動します。起動オプションでコンテナの9200とホスト9200のポートマッピングが必須です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079551/31879328-0350-402d-b751-837ea56d6315.png)
- ContainerのLogsから起動確認します
```
bin/elasticsearch-reset-password -u elastic -i
```
- ContainerのExecからパスワード設定します。パスワードはelasticにします
```
curl -u elastic:elastic -k -X GET "https://localhost:9200"
```
- ホストのコマンドラインからこのコマンドが成功するか確認します

```
for %f in (*.json) do curl -u elastic:elastic -k -X POST "https://localhost:9200/_bulk" -H "Content-Type: application/x-ndjson" --data-binary @%f
```
- bulk-json-outputでコマンドプロンプトを立ち上げこのコマンドを実行します

## elasticsearchにたくさんmore_like_thisクエリを送る
- 自前ツールつかいます

https://github.com/shirousuda/elasticsearch_relate_calc

```
pip install requests
```
- 依存ライブラリインストールです

```
python elasticsearch_relate_calc.py
```
- elasitcsearchにmore_like_thisクエリを送り、結果をrelated_linkとしてelasitcsearchに保存するスクリプトです
```
python es_to_markdown.py
```
- elasitcsearchのデータからObsidian用マークダウンを作ります。実行場所にobsidian_notesというディレクトリを作成、配下にファイル出力します。related_linkがObsidianのリンクになります

- つくったファイルをObsidianのvaultに配置します
- 完

## 感想
- アンパンマンで"幼児"というキーワードをつかっているので、子供に関するノートがヒットしているようです
- 他のノートで"幼児"というキーワードを直接使用しているわけではないのですが、特にチューニングしなくてもシノニムにちゃんと反応しました
- ディズニーは"子供"というキーワードつかってたのでたぶんそのせい
- スターウォーズはアナキンが少年のころみたいな解説があったのでたぶんそのせい
- 山本太郎はタイトルと関係なく幼稚園の話題で子供というキーワードつかってたのでたぶんそのせい
- アンパンマンのノートでタイトルと関係ない離婚について話しているので、それ系記事がリンクになっているようです
- 関係ないけどアナキンでぐぐるとダースベイダーがでてきてひどい。シノニムになっているのかな