http://www.cs.berkeley.edu/~dawnsong/papers/se.pdf
Highly-Scalable Searchable Symmetric Encryption with Support for Boolean Queries (2013)
A simple solution: divide the data into N blocks. Create an index that maps words to blocks (e.g. word "hello" is on blocks 36, 43, 84). Then encrypt the blocks and the index and upload them to the server. When you want to search, you just download the index, decrypt it, then use it to identify the blocks you need to download from the server.
The first paper I linked has some more advanced techniques of the same sort.
It depends on how "deep" you want to search. Also, to get Slack's functionality, you need to be able to search through history that your client might not have "seen" yet because you were not in the channel when it happened.