Hiện tại mình đang làm chức năng search cho website viết bằng Laravel, csdl Mysql.
Vấn đề hiện tại chức năng search (mình dùng FullTextSearch) trả về kết quả không mong muốn :
Ví dụ database, có record Nếu Có Buông Tay
, khi mình search Nếu có
/có buông
/ buông tay
tiếng việt có dấu hay không dấu đều trả về kết quả Nếu Có Buông Tay
. Nhưng khi search Nếu Buông
/ Có Tay
thì không trả về kết quả nào cả, tương tự với Love The Way You Lie
, khi search Love You Lie
cũng không trả về kết quả nào.
Đây là đoạn code function search của mình:
<?php
namespace App;
trait FullTextSearch
{
protected function fullTextWildcards($term)
{
// removing symbols used by MySQL
$reservedSymbols = ['-', '+', '<', '>', '@', '(', ')', '~', '.'];
$term = str_replace($reservedSymbols, ' ', $term);
$words = explode(' ', $term);
$searchTerm = implode( ' ', $words);
return $searchTerm;
}
public function scopeFulltextsearch($query, $term)
{
$columns = implode(',',$this->searchable);
// If user search only one word or one character
if(!ctype_space($term)) {
return $query->whereRaw("CONCAT($columns) LIKE '%".$term."%'") ;
}
$searchableTerm = $this->fullTextWildcards($term);
return $query->selectRaw("MATCH ({$columns}) AGAINST (? IN BOOLEAN MODE) AS relevance_score", [$searchableTerm])
->whereRaw("MATCH ({$columns}) AGAINST (? IN BOOLEAN MODE)", $searchableTerm)
->orderByDesc('relevance_score');
}
}
Mình đã đọc tài liệu về full text search, inverted index nhưng không tìm ra được solution. Mong mọi người giúp đỡ.
Mình cảm ơn trước