In filtering
In a “collection-like interface”, Fowler does not mean something that provides an API that looks like an array or list: it has nothing to do with ICollection<T> , for example! The repository should encapsulate all the technological details of the persistence layer, but its API must be defined so that it is expressive in the business area.
You should consider specifications as logical predicates that are related to the domain (indeed, they are first-class citizens in the domain model), which can be compiled both to check the various qualities of the object and to select objects from the set (a set that can be repository or simple list). For example, in the financial domain model that I developed for an Italian bank, I had DurationOfMBondSpecification , StandardAndPoorsLongTermRatingSpecification , etc.
In fact, in DDD, specifications come from the business requirements (often contractual boundaries) that must be met by software during its operations. They can be used as an abstraction for the filter, but it looks more like a good side effect.
At SORTING
Most of the time, sorting (and slicing, and grouping ...) is just an interest in the presentation. When this is a business problem, the correct mappings (and groups, etc.) should be partitioned off as domain concepts from domain expert knowledge. However, even with it, just a preoccupation with the view, it is much more efficient to process it in the repository.
In .NET, one of the possible (and very expensive) solutions to these problems is to create a custom LINQ provider (or more than one) that can translate all the request, which can be expressed using the ubiquitous language to the desired level of storage. However, this solution has a serious drawback: if you cannot translate all queries from the very beginning, you can never appreciate the effort to change the application using the domain: the time will come when you have to deeply reorganize QueryProvider to process a new complex query (and such refactoring will cost you much more than you can afford).
To solve this problem, in the (incomplete and very ambitious) Epic framework (disclaimer: I am the main developer), we decided to join the specification template and the request object template, providing a general purpose API that allows customers to filter using specifications, sort with using comparisons and trim with integers without the (unpredictable) LINQ overhead.
In the Fowler scheme (see below), we pass both the specification repository (aCriteria) and additional sort requests:

Alternatively, you can simply use custom repositories : this is a much cheaper approach if you don't have thousands of different types of requests.
Bonus Solution
A quick but still correct solution is to "just" use the persistence language, as for queries. DDD for complex operational boundaries and queries (in most cases) does not work: that way, you can simply use the language provided by your SQL or NoSQL database to get the predictions and / or identifiers of the objects you need to manipulate that you need. You will see how the dataset that you request is very different from the dataset needed to provide domain invariants!
That is why, for example, sometimes serialization files may be the best way to save a domain for a given problem.
In the end, what are file systems, if not the most common NoSQL databases !: - D