The client incrementally builds a search index, encrypts it using an appropriate random access encryption primitive, and writes it to the cloud encrypted. At search time it reads as necessary from the encrypted index. (This allows some light traffic analysis; if you can't tolerate that the client can store a copy of the entire index)