diff -up apachesolr/apachesolr.admin.inc updated/apachesolr.admin.inc
--- apachesolr/apachesolr.admin.inc	2009-07-23 04:00:58.000000000 -1000
+++ updated/apachesolr.admin.inc	2009-10-30 12:18:59.000000000 -1000
@@ -558,6 +558,47 @@ function apachesolr_mlt_block_form($delt
     '#default_value' => $block['mlt_maxqt'],
   );
 
+  $form['restrictions'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Restrictions configuration'),
+    '#weight' => '1',
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+
+  $_types = node_get_types('types');
+  $options = array();
+  foreach ($_types as $key => $type) {
+    $options[$key] = $type->name;
+  }
+  $_default = $block['mlt_res_types'];
+  if (!is_array($_default)) { $_default = array(); }
+
+  $form['restrictions']['mlt_res_types'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Content Types'),
+    '#default_value' => $_default,
+    '#options' => $options,
+    '#description' => t('Select the content types that More Like This results should be restricted to.'),
+    '#weight' => '-2',
+  );
+
+  $form['restrictions']['mlt_res_criteria'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Additional Criteria'),
+    '#description' => t('The additional criteria which all entries returned by this block must meet. Separate each criteria with a space. Ex. \'title:strategy\' will filter related content further to only those with strategy in the title.  Likewise \'HDTV^3\' will boost the term HDTV by a factor of 3'),
+    '#required' => FALSE,
+    '#default_value' => $block['mlt_res_criteria'],
+    '#weight' => '-1',
+  );
+
+  //field:[* TO 100]
+  //createdate:[1995-12-31T23:59:59.999Z TO 2007-03-06T00:00:00Z]
+  //-inStock:false   -returns where 'inStock' is not false
+  //HDTV^3 -boost the term being searched for
+  //+title:strategies -title must contain strategies
+  //-title:strategies -title must NOT contain strategies
+
   return $form;
 }
 
@@ -577,6 +618,8 @@ function apachesolr_mlt_block_defaults($
     'mlt_minwl' => '3',
     'mlt_maxwl' => '15',
     'mlt_maxqt' => '20',
+    'mlt_res_criteria' => '',
+    'mlt_res_types' => '',
   );
 }
 
@@ -624,6 +667,7 @@ function apachesolr_mlt_save_block($bloc
   $blocks[$delta] = array_intersect_key($block_settings, $defaults) + $defaults;
   // Eliminate non-selected fields.
   $blocks[$delta]['mlt_fl'] = array_filter($blocks[$delta]['mlt_fl']);
+
   variable_set('apachesolr_mlt_blocks', $blocks);
 }
 
@@ -649,4 +693,3 @@ function apachesolr_mlt_delete_block_for
   drupal_set_message(t('The block has been deleted.'));
   $form_state['redirect'] = 'admin/build/block';
 }
-
diff -up apachesolr/apachesolr.module updated/apachesolr.module
--- apachesolr/apachesolr.module	2009-07-23 04:08:42.000000000 -1000
+++ updated/apachesolr.module	2009-10-30 12:14:52.000000000 -1000
@@ -1275,7 +1275,6 @@ function apachesolr_theme() {
  * @return An array of response documents, or NULL
  */
 function apachesolr_mlt_suggestions($settings, $id) {
-
   try {
     $solr = apachesolr_get_solr();
     $fields = array(
@@ -1299,8 +1298,50 @@ function apachesolr_mlt_suggestions($set
         $params[$name] = $settings[$form_key];
       }
     }
+
     $query = apachesolr_drupal_query('id:' . $id);
 
+    //if types available via array
+    if (is_array($settings['mlt_res_types'])) {
+      $_apply_sub = FALSE; //by default we will not apply the subquery
+      $sub_query = apachesolr_drupal_query();
+      //loop over content type restrictions
+      foreach ($settings['mlt_res_types'] as $type => $enabled) {
+
+        //if at least one content type was selected, then we'll limit results based on them
+        if ($enabled) {
+          $_apply_sub = TRUE;
+          $sub_query->add_filter('type', $type);
+        }
+
+        //if we're restricting the results
+        if ($_apply_sub) {
+          $query->add_subquery($sub_query);
+        }
+      }//end - loop
+    }//end - is array
+
+    //if there was an additional criteria specified
+    if (trim($settings['mlt_res_criteria']) !== "") {
+      $_criterias = explode(' ', trim($settings['mlt_res_criteria']));
+
+      $sub_query = apachesolr_drupal_query();
+
+      foreach ($_criterias as $idx => $_criteria) {
+        if ($_str_pos = strpos($_criteria, ':')) {
+          list($field, $value) = explode(':', $criteria);
+          $sub_query->add_filter($field, $value); // The TRUE makes it a negative filter.
+        } elseif ($_str_pos = strpos($_criteria, '^')) {
+          $params['bq'][] = $_criteria;
+        } else {
+          $sub_query->add_filter('title', $_criteria); // The TRUE makes it a negative filter.
+          $sub_query->add_filter('body', $_criteria); // The TRUE makes it a negative filter.
+        }
+      }
+
+      $query->add_subquery($sub_query);
+    }//end - if
+
     // This hook allows modules to modify the query and params objects.
     apachesolr_modify_query($query, $params, 'apachesolr_mlt');
     if (empty($query)) {
@@ -1588,4 +1629,3 @@ interface Drupal_Solr_Query_Interface {
    */
   function set_available_sort($field, $sort);
 }
-
