Choose a facet using the search form and then show filtered results The requirement is that the user specifies a facet before they search. Here's what the search form should look like:
 

Adding the select list to the search form is a straight forward form_alter(). My problem is how do I send the selected audience value from the drupal form to solr?

Once I have the audience value in the solr query object, I think I would apply the facet by using HOOK_apachesolr_query_prepare() (or HOOK_apachesolr_query_alter()).

Thanks!
Here's my solution:

Add the select menu to the form and append a custom submit function

  function ucb_parking_form_alter(&amp;$form, &amp;$form_state, $form_id) {
  switch ($form_id) {
    case "search_block_form":
      // Add the audience select list
      $form['search_audience'] = array(
       '#type' =&gt; 'select',
       //'#title' =&gt; t('Choose Audience'),
       '#options' =&gt; array(
      47 =&gt; t('Faculty/Staff'),
      36 =&gt; t('Student'),
      ),
       '#description' =&gt; t('Focus your search on an audience.'),
      );
      //Add a custom submit function to the end of the array of functions.
      //(This function will run after apachesolr_search_form_search_submit().)
      array_push($form['#submit'], 'ucb_parking_front_page_search_submit');
      break;
  }

}


In the custom submit function construct the solr url with a query string representing the facet that should be applied and redirect the user there:

function ucb_parking_front_page_search_submit($form, &amp;$form_state) {
  /*
   * Simply construct the solr url for the search.  
   * Note the querystring for the facet must be passed via an array with the 'query' key
   * to ensure correct urlencoding.
   */
  $form_state['redirect'] = array($form_state['redirect'], array('query' =&gt; array('f[0]' =&gt; 'im_field_audience:' . $form_state['values']['search_audience'])));
  //drupal_goto is probably equivalent
  //drupal_goto($form_state['redirect'], array('query' =&gt; array('f[0]' =&gt; 'im_field_audience:' . $form_state['values']['search_audience'])));
}


I think that this is the correct approach because apachesolr does pretty much the same thing with $form_state['redirect']:

/**
 * Added form submit function to retain filters.
 *
 * @see apachesolr_search_form_search_form_alter()
 */
function apachesolr_search_form_search_submit($form, &amp;$form_state) {
  $fv = $form_state['values'];
  // Replace keys with their rawurlencoded value
  if (isset($fv['search_block_form'])) {
    $raw_keys = str_replace("/","%2f",$fv['search_block_form']);
    $form_state['redirect'] = str_replace($fv['search_block_form'], $raw_keys, $form_state['redirect']);
  }
}