こんにちは。
インフラが主体の場合もあれば、システムが主体の場合もあり、決められるところから始めるのが自然だと思います。
背景を読んだ限りでは、システムにとって「全文検索機能」が「何であるか」は重要ではないようなので、後で決めれば良いと思います。
逆に、「OpenSearch とか使う」から始まる開発なら、そこを後から変更することは考える必要すらないわけです。
例えば全文検索機能が必要なサービスがあるとしますね。
このサービスから見て使いたい「全文検索機能」とは、そこに「全文を検索する機能丸ごとが存在する必要がある」と考えるのではなく、「とあるパラメータを揃えて投げたら、全文検索された結果が返ってくる穴」くらいに抽象化して考えます。
すなわち、サービスが必要とする「最小のインターフェース」を考えるわけです。
サービスの開発を進めるにあたって、「どのようなインターフェースが必要か」まで考えておけばよく、そのインターフェースの向こう側が何であるかは考えなくても開発は進められます。
要は、インターフェースの実装は「サービスがインターフェースに求める要件」を満たしていれば良いので、いくらでも後から差し替えが効きます。
それで、例えばそのインターフェースの実装に「適当な固定値を返す誰か」等を置けば、それはユニットテストのテストスタブになるわけですね。
先にインフラの見当を付けておくことにもメリットはあり、「サービスが求めるインターフェース」をそのインフラで簡単に実装できるかどうか、という点についてインターフェースの設計を行う際の追加情報が得られます。
インフラの特性を活かしやすいインターフェースを考える余地が生まれるわけです。
後から変更して手戻りになりやすいのはここで、サービス側から考えた最良のインターフェースが、実はインフラ側からだと実装難度が高くて無理ということになりかねないからです。
この視点でも、インターフェースを設計する際には可能な限り最小の構成になるようにしておくと、ここをすり合わせるのが一気に簡単になるので、どちらを主体にして設計するにしても、最小性はとても重要です。
結論として、「設計できるところから設計すれば良いが、その間のインターフェース設計は常に可能な限り最小を維持することを目指す」と考えておけば十分だと思います。