searchnosについてnpub1q7qyk7rvdga5qzmmyrvmlj29qd0n45snmfuhkrzsj4rk0sm4c4psvqwt9c2023-03-10 Nostr勉強会 #1
View Slide
@darashinostrbuzzsの作者です。
searchnosとはhttps://github.com/darashi/searchnosNostrbuzzsに検索機能がほしい、けど...NIP-50 (Search Capability;検索)対応のリレーが少ないので、自分で作ってみました。リレー風のサーバですが、フル機能のリレーではありません。
考えたことリレーを自前で作るのは大変そう現状でも既に大変そう今後の NIPに対応し続けるのも大変そうリレーを自前で運用するのも大変そうユーザのリレーリストに追加してもらい、こちらにイベントを投げてもらわないといけない。そのレベルのものを運用するのは大変そう。→イベントは既存のリレーから取得するのがよさそう。小判鮫的な。
しくみsearchnosindexer searcherrelay-1relay-2Elasticsearchweb-browser
indexer指定したリレーに接続し、kind1とkind5を購読する。イベントに応じて Elasticsearchの状態を更新する。searcherREQが来たら、Elasticsearchにクエリを投げて、結果を返し、最後にEOSEを送る。(内部的な)クエリ購読者リストに追加する。一定時間ごとにポーリング購読者があるクエリを順番に Elasticsearchに投げて、新着の結果を購読者に流す。
clientsearcher Elasticsearch indexer relaylooploopREQ w/"search"1query2response3EVENT (if matched)4EVENT (if matched)5EOSE6kind:17index request8wait9query10response11EVENT (if matched & unread)12CLOSE13clientsearcher Elasticsearch indexer relay
おもしろポイント同じクエリを購読しているクライアントのクエリは、一つにまとめてElasticsearchに投げる。buzzphrasesに関していうと、何人もが同じクエリを購読することがよくある。Simple query string query ※を使っているので、複雑な条件を持つ検索ができる※ https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html
まとめ既存のリレーから noteを収集し、 NIP-50に対応した検索機能を提供するリレーっぽいサーバーを作った。
今後の課題通常のフィルタ条件 (NIP-01)に対応する。現状 limitにしか対応できていないkind:0 (NIP-01)にも対応する...?購読者の多いクエリは頻繁にポーリングするなど、もう少し賢いクエリスケジューリング。言語推定と言語によるフィルタリングに対応する...?spamフィルタに対応する...?どうやって...?NIP-56があるので、信頼できるユーザの pubkeyを定義して、その kind:1984から spamフィルタを学習する、とかはありかもしれない。運用が大変そう...