I'm using MySQL FullText search and It works, but I can't get the following result.
Ex:
SELECT * FROM countries WHERE MATCH (name)
AGAINST ("Chinese*" IN BOOLEAN MODE);
It should give me the country record "China", but it doesn't work, any advice to make this function better/work?
My Full Code:
protected function fullTextWildcards($term)
{
// removing symbols used by MySQL
$reservedSymbols = ['-', '+', '<', '>', '@', '(', ')', '~'];
$term = str_replace($reservedSymbols, '', $term);
$words = explode(' ', $term);
foreach($words as $key => $word) {
/*
* applying + operator (required word) only big words
* because smaller ones are not indexed by MySQL
*/
if(strlen($word) >= 3) {
$words[$key] = '' . $word . '*';
}
}
$searchTerm = implode( ' ', $words);
return $searchTerm;
}
/**
* Scope a query that matches a full text search of term.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $term
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeSearch($query, $term)
{
$columns = implode(',',$this->searchable);
$query->whereRaw("MATCH ({$columns}) AGAINST (? IN BOOLEAN MODE)" , $this->fullTextWildcards($term));
return $query;
}
My Solution was breaking the words smaller:
if(strlen($word) >= 7){
$split_string = str_split($word, 4);
$join = implode( '*', $split_string);
$words[$key] = '' . $join . '*';
}else{
$words[$key] = '' . $word . '*';
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.