X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/b251671e3f2fdd2778506f0b36889c22b18ba1eb..refs/pull/263/head:/app/Entity.php diff --git a/app/Entity.php b/app/Entity.php index 2c447814f..e8deddf0a 100644 --- a/app/Entity.php +++ b/app/Entity.php @@ -4,6 +4,8 @@ class Entity extends Ownable { + protected $fieldsToSearch = ['name', 'description']; + /** * Compares this entity to another given entity. * Matches by comparing class and id. @@ -157,42 +159,46 @@ class Entity extends Ownable * @param string[] array $wheres * @return mixed */ - public function fullTextSearchQuery($fieldsToSearch, $terms, $wheres = []) + public function fullTextSearchQuery($terms, $wheres = []) { $exactTerms = []; $fuzzyTerms = []; $search = static::newQuery(); + foreach ($terms as $key => $term) { - $safeTerm = htmlentities($term, ENT_QUOTES); - $safeTerm = preg_replace('/[+\-><\(\)~*\"@]+/', ' ', $safeTerm); - if (preg_match('/".*?"/', $safeTerm) || is_numeric($safeTerm)) { - $safeTerm = preg_replace('/^"(.*?)"$/', '$1', $term); - $exactTerms[] = '%' . $safeTerm . '%'; + $term = htmlentities($term, ENT_QUOTES); + $term = preg_replace('/[+\-><\(\)~*\"@]+/', ' ', $term); + if (preg_match('/".*?"/', $term) || is_numeric($term)) { + $term = str_replace('"', '', $term); + $exactTerms[] = '%' . $term . '%'; } else { - $safeTerm = '' . $safeTerm . '*'; - if (trim($safeTerm) !== '*') $fuzzyTerms[] = $safeTerm; + $term = '' . $term . '*'; + if ($term !== '*') $fuzzyTerms[] = $term; } } - $isFuzzy = count($exactTerms) === 0 || count($fuzzyTerms) > 0; + + $isFuzzy = count($exactTerms) === 0 && count($fuzzyTerms) > 0; + // Perform fulltext search if relevant terms exist. if ($isFuzzy) { $termString = implode(' ', $fuzzyTerms); - $fields = implode(',', $fieldsToSearch); + $fields = implode(',', $this->fieldsToSearch); $search = $search->selectRaw('*, MATCH(name) AGAINST(? IN BOOLEAN MODE) AS title_relevance', [$termString]); $search = $search->whereRaw('MATCH(' . $fields . ') AGAINST(? IN BOOLEAN MODE)', [$termString]); } // Ensure at least one exact term matches if in search if (count($exactTerms) > 0) { - $search = $search->where(function ($query) use ($exactTerms, $fieldsToSearch) { + $search = $search->where(function ($query) use ($exactTerms) { foreach ($exactTerms as $exactTerm) { - foreach ($fieldsToSearch as $field) { + foreach ($this->fieldsToSearch as $field) { $query->orWhere($field, 'like', $exactTerm); } } }); } + $orderBy = $isFuzzy ? 'title_relevance' : 'updated_at'; // Add additional where terms