Kết quả tìm kiếm FullTextSearch không như mong muốn?
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
Fuzzy search
Trong MySQL SOUNDEX() nhưng không hoạt động trên Unicode.
How do I do a fuzzy match of company names in MYSQL with PHP for auto-complete?
bạn chụp cho mình xem cái đoạn bạn khai báo fulltext index của nó với. Mình đã làm cái fulltext search này nhưng cho tiếng Nhật. Vừa thử đảo chữ thấy vẫn tìm ra bình thường. Tiếng Việt thì chắc cũng na ná tiếng Nhật
Mình nghĩ là có thể tại bạn dùng " IN BOOLEAN MODE". thử thay bằng “IN NATURAL LANGUAGE MODE”
cám ơn mọi người đã giúp đỡ, sau khi mò bug 1 hồi mình đã tìm ra được giải pháp.
Vấn đề là đoạn code xử lý ở trên chưa tốt nên dẫn đến không search full text mà chỉ search theo LIKE