Merit of a "Search" class similar to a "Builder" class
You can generify your ItemManager

class ItemManager&lt;T extends Item&gt; {

    List&lt;T&gt; items;

    public ItemManager() {

        items = Database.retrieveItems();

    }
}


The search method can be refactored with this help of CollectionUtils like this

public Collection&lt;Item&gt; search() {
    return getMatchedItems();
}


And her is getMatchedItems()

public Collection&lt;Item&gt; getMatchedItems() {
    CollectionUtils.select(items, new Predicate() {
    public boolean evaluate(Object o) {
        Item item = (Item)o;
        return containsA(item) &amp;&amp; containsB(item) &amp;&amp; containsC(item) //explain below 
    }
    });

    return items
}


IMO its better to create seperate methods like containsA() , containsB().... 

Because as you mentioned you have many attributes(let presume 50), then one big if will sooner or later lend you in problems like readability, maintainability and testing.
You may say that creating separate methods may degrade your performance but jvm handles method inlining pretty well.