FIX Double escape namespace separators in class names when boosting fields

This commit is contained in:
Robbie Averill 2017-12-05 16:49:55 +13:00
parent 16a5643d1b
commit b64f02727c
2 changed files with 51 additions and 34 deletions

View File

@ -19,12 +19,12 @@ class SearchQuery extends ViewableData
/** These are public, but only for index & variant access - API users should not manually access these */ /** These are public, but only for index & variant access - API users should not manually access these */
public $search = array(); public $search = [];
public $classes = array(); public $classes = [];
public $require = array(); public $require = [];
public $exclude = array(); public $exclude = [];
protected $start = 0; protected $start = 0;
protected $limit = -1; protected $limit = -1;
@ -42,14 +42,20 @@ class SearchQuery extends ViewableData
} }
/** /**
* @param String $text Search terms. Exact format (grouping, boolean expressions, etc.) depends on the search implementation. * @param string $text Search terms. Exact format (grouping, boolean expressions, etc.) depends on
* @param array $fields Limits the search to specific fields (using composite field names) * the search implementation.
* @param array $boost Map of composite field names to float values. The higher the value, * @param array $fields Limits the search to specific fields (using composite field names)
* the more important the field gets for relevancy. * @param array $boost Map of composite field names to float values. The higher the value,
* the more important the field gets for relevancy.
*/ */
public function search($text, $fields = null, $boost = array()) public function search($text, $fields = null, $boost = [])
{ {
$this->search[] = array('text' => $text, 'fields' => $fields ? (array)$fields : null, 'boost' => $boost, 'fuzzy' => false); $this->search[] = [
'text' => $text,
'fields' => $fields ? (array) $fields : null,
'boost' => $boost,
'fuzzy' => false
];
} }
/** /**
@ -57,44 +63,52 @@ class SearchQuery extends ViewableData
* to find the searched terms. For example, a term "fishing" would also likely find results * to find the searched terms. For example, a term "fishing" would also likely find results
* containing "fish" or "fisher". Depends on search implementation. * containing "fish" or "fisher". Depends on search implementation.
* *
* @param String $text See {@link search()} * @param string $text See {@link search()}
* @param array $fields See {@link search()} * @param array $fields See {@link search()}
* @param array $boost See {@link search()} * @param array $boost See {@link search()}
*/ */
public function fuzzysearch($text, $fields = null, $boost = array()) public function fuzzysearch($text, $fields = null, $boost = [])
{ {
$this->search[] = array('text' => $text, 'fields' => $fields ? (array)$fields : null, 'boost' => $boost, 'fuzzy' => true); $this->search[] = [
'text' => $text,
'fields' => $fields ? (array) $fields : null,
'boost' => $boost,
'fuzzy' => true
];
} }
public function inClass($class, $includeSubclasses = true) public function inClass($class, $includeSubclasses = true)
{ {
$this->classes[] = array('class' => $class, 'includeSubclasses' => $includeSubclasses); $this->classes[] = [
'class' => $class,
'includeSubclasses' => $includeSubclasses
];
} }
/** /**
* Similar to {@link search()}, but typically used to further narrow down * Similar to {@link search()}, but typically used to further narrow down
* based on other facets which don't influence the field relevancy. * based on other facets which don't influence the field relevancy.
* *
* @param String $field Composite name of the field * @param string $field Composite name of the field
* @param Mixed $values Scalar value, array of values, or an instance of SearchQuery_Range * @param mixed $values Scalar value, array of values, or an instance of SearchQuery_Range
*/ */
public function filter($field, $values) public function filter($field, $values)
{ {
$requires = isset($this->require[$field]) ? $this->require[$field] : array(); $requires = isset($this->require[$field]) ? $this->require[$field] : [];
$values = is_array($values) ? $values : array($values); $values = is_array($values) ? $values : [$values];
$this->require[$field] = array_merge($requires, $values); $this->require[$field] = array_merge($requires, $values);
} }
/** /**
* Excludes results which match these criteria, inverse of {@link filter()}. * Excludes results which match these criteria, inverse of {@link filter()}.
* *
* @param String $field * @param string $field
* @param mixed $values * @param mixed $values
*/ */
public function exclude($field, $values) public function exclude($field, $values)
{ {
$excludes = isset($this->exclude[$field]) ? $this->exclude[$field] : array(); $excludes = isset($this->exclude[$field]) ? $this->exclude[$field] : [];
$values = is_array($values) ? $values : array($values); $values = is_array($values) ? $values : [$values];
$this->exclude[$field] = array_merge($excludes, $values); $this->exclude[$field] = array_merge($excludes, $values);
} }

View File

@ -133,8 +133,8 @@ abstract class SolrIndex extends SearchIndex
* *
* @see http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.WhitespaceTokenizerFactory * @see http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.WhitespaceTokenizerFactory
* *
* @param String $field * @param string $field
* @param String $type * @param string $type
* @param Array $params Parameters for the analyzer, usually at least a "class" * @param Array $params Parameters for the analyzer, usually at least a "class"
*/ */
public function addAnalyzer($field, $type, $params) public function addAnalyzer($field, $type, $params)
@ -243,7 +243,7 @@ abstract class SolrIndex extends SearchIndex
/** /**
* Extract a human friendly spelling suggestion from a Solr spellcheck collation string. * Extract a human friendly spelling suggestion from a Solr spellcheck collation string.
* @param String $collation * @param string $collation
* @return String * @return String
*/ */
protected function getNiceSuggestion($collation = '') protected function getNiceSuggestion($collation = '')
@ -262,7 +262,7 @@ abstract class SolrIndex extends SearchIndex
* Extract a query string from a Solr spellcheck collation string. * Extract a query string from a Solr spellcheck collation string.
* Useful for constructing 'Did you mean?' links, for example: * Useful for constructing 'Did you mean?' links, for example:
* <a href="http://example.com/search?q=$SuggestionQueryString">$SuggestionNice</a> * <a href="http://example.com/search?q=$SuggestionQueryString">$SuggestionNice</a>
* @param String $collation * @param string $collation
* @return String * @return String
*/ */
protected function getSuggestionQueryString($collation = '') protected function getSuggestionQueryString($collation = '')
@ -387,7 +387,7 @@ abstract class SolrIndex extends SearchIndex
} }
/** /**
* @param String $name * @param string $name
* @param Array $spec * @param Array $spec
* @param Array $typeMap * @param Array $typeMap
* @return String XML * @return String XML
@ -428,9 +428,9 @@ abstract class SolrIndex extends SearchIndex
/** /**
* Convert definition to XML tag * Convert definition to XML tag
* *
* @param String $tag * @param string $tag
* @param String $attrs Map of attributes * @param string $attrs Map of attributes
* @param String $content Inner content * @param string $content Inner content
* @return String XML tag * @return String XML tag
*/ */
protected function toXmlTag($tag, $attrs, $content = null) protected function toXmlTag($tag, $attrs, $content = null)
@ -448,8 +448,8 @@ abstract class SolrIndex extends SearchIndex
} }
/** /**
* @param String $source Composite field name (<class>_<fieldname>) * @param string $source Composite field name (<class>_<fieldname>)
* @param String $dest * @param string $dest
*/ */
public function addCopyField($source, $dest, $extraOptions = array()) public function addCopyField($source, $dest, $extraOptions = array())
{ {
@ -881,6 +881,9 @@ abstract class SolrIndex extends SearchIndex
if ($fields) { if ($fields) {
$searchq = array(); $searchq = array();
foreach ($fields as $field) { foreach ($fields as $field) {
// Escape namespace separators in class names
$field = $this->sanitiseClassName($field);
$boost = (isset($search['boost'][$field])) ? '^' . $search['boost'][$field] : ''; $boost = (isset($search['boost'][$field])) ? '^' . $search['boost'][$field] : '';
$searchq[] = "{$field}:".$part.$fuzzy.$boost; $searchq[] = "{$field}:".$part.$fuzzy.$boost;
} }