There is no type of information as divided between two worlds as contracts.
Sometimes you want a data grid that you can filter and manipulate. This is the structured, numerical world.
Sometimes you want to interrogate the text itself, Ctrl-F-style. This is the unstructured, linguistic world.
In most cases, you want to do these things across your entire set (or any given subset) of contracts, not just one at a time. And you want to seamlessly switch between the two.
This means you need a data structure simultaneously optimised for both worlds.
There are no off-the-shelf products that come close to that requirement. If you try cobbling together a contract database yourself, it’s therefore almost certainly going to fail.
You need a contract database whose underlying structure was explicitly designed to sit in that special intersection.