Index: web/sys/SearchObject/Solr.php =================================================================== --- web/sys/SearchObject/Solr.php (revision 4252) +++ web/sys/SearchObject/Solr.php (working copy) @@ -71,6 +71,8 @@ protected $searchSubType = ''; // Used to pass hidden filter queries to Solr protected $hiddenFilters = array(); + // Multiselect facets + protected $multiSelectFacets = array(); // Spelling protected $spellingLimit = 3; @@ -97,6 +99,9 @@ $this->allFacetSettings = getExtraConfigArray('facets'); $this->facetConfig = array(); $facetLimit = $this->getFacetSetting('Results_Settings', 'facet_limit'); + $this->multiSelectFacets = explode(',', $this->getFacetSetting( + 'Results_Settings', 'multiselect_facets' + )); if (is_numeric($facetLimit)) { $this->facetLimit = $facetLimit; } @@ -964,18 +969,33 @@ // Define Filter Query $filterQuery = $this->hiddenFilters; + $orFilterQuery = array(); foreach ($this->filterList as $field => $filter) { foreach ($filter as $value) { // Special case -- allow trailing wildcards and ranges: if (substr($value, -1) == '*' || preg_match('/\[[^\]]+\s+TO\s+[^\]]+\]/', $value) ) { - $filterQuery[] = "$field:$value"; + if (in_array($field, $this->multiSelectFacets)) { + $orFilterQuery[$field][] = "$field:$value"; + } else { + $filterQuery[] = "$field:$value"; + } } else { - $filterQuery[] = "$field:\"$value\""; + if (in_array($field, $this->multiSelectFacets)) { + $orFilterQuery[$field][] = "$field:\"$value\""; + } else { + $filterQuery[] = "$field:\"$value\""; + } } } } + if(!empty($orFilterQuery)) { + foreach ($orFilterQuery as $field => $filter) { + $filterQuery[] = '{!tag=' . $field . '_filter}' + . '('. implode(" OR ", $filter) . ')'; + } + } // If we are only searching one field use the DisMax handler // for that field. If left at null let solr take care of it @@ -988,6 +1008,9 @@ if (!empty($this->facetConfig)) { $facetSet['limit'] = $this->facetLimit; foreach ($this->facetConfig as $facetField => $facetName) { + if (in_array($facetField, $this->multiSelectFacets)) { + $facetField = '{!ex=' . $facetField . '_filter}' . $facetField; + } $facetSet['field'][] = $facetField; } if ($this->facetOffset != null) { Index: web/conf/facets.ini =================================================================== --- web/conf/facets.ini (revision 4259) +++ web/conf/facets.ini (working copy) @@ -55,6 +55,8 @@ ; If using facets at the top of search results you have more room for text. [Results_Settings] facet_limit = 30 ; how many values should we show for each facet? +; Specify which facet fields are multi-select (filters are OR'ed instead of AND'ed) +;multiselect_facets = institution,building,format ; Rows and columns for table used by top facets top_rows = 2 top_cols = 3