Just have a div with id 'target_id' ready and add this to your view:

<pre><code>
<input id="search" name="search" type="text" value="">
<%= observe_field 'search',  :frequency => 0.5, 
         :update => 'target_id', :url => 
         { :controller => '<controller>', :action=> 'list' }, 
         :with => "'search=' + escape(value)" %>
</code></pre>

Next, add an action for this, like the following (which also uses the paginate function):

<pre><code>
def list
	 if @params['search']
		@items_pages, @items = paginate :items,
               :order_by => 'description',
		 :conditions => [ 'LOWER(description) LIKE ?',
		 '%' + @params['search'].downcase + '%' ], 
		 :per_page => 20
		@mark_term = @params['search']
	 else
		@items_pages, @items = paginate :items, 
		:order_by => 'description', :per_page => 20
	 end
	 render_without_layout
  end
</code></pre>

You can then use the @mark_term in your 'list' view like this:

<pre><code>
<%= @mark_term ? highlight(item.description, @mark_term) : h(item.description) %>
</code></pre>

To use the paginator with ajax, use something like this in your 'list' view:

<pre><code>
<%= link_to_remote(h('< Previous'), 
         :update => 'target_id', 
         :url => { :page => paginator.current.previous }) %> 
-
<%= link_to_remote(h('Next >'), 
         :update => 'target_id', 
         :url => { :page => paginator.current.next }) %>
</code></pre>

*dgm* I had to add a parameter to the paginate links:
<pre><code>
<%= link_to_remote(h('< Previous'), 
         :update => 'target_id', 
         :url => { :page => paginator.current.previous, :search => @params['search'] }) %> 
</code></pre>

*paul* It seems that if you type a '&' in the search box, whatever follows will not be passed in the search text. That is, if you type _Chip&Dale_ in the search box, only _Chip_ will be passed. However, I experimented and this site implements it correctly. Maybe they should tell us the trick?
