I had the same doubt, here I found what might be the answer.
fields limits the fields whose contents are parsed and returned
_source_filtering restricts fields
Another way to see that fields are used to optimize data transfer and CPU utilization, while _source_filtering only optimizes data transfer.
Source filtering allows us to control which parts of the original JSON document are returned for each hit [...] It should be borne in mind that this only saves us on bandwidth costs between the nodes involved in the search, as well as the client, not the processor or drive, as it was when using the fields.
Moreover:
One of the functions that are not usually known is the ability to select metadata fields. Of particular note is its ability to select a _ttl field that actually returns the number of milliseconds before the document expires, rather than the document’s original life. Very handy feature.
source share