[英]MySQL/PHP Boolean Fulltext Search Issue in Laravel 4
我有以下代碼,可以在Laravel 4中的模型中搜索搜索詞組。 它使用'IN BOOLEAN MODE'和MATCH()和AGAINST()。
public function scopeSearch($query, $q)
{
$fields = Static::getFields();
$fields = implode(', ', $fields);
$query->whereRaw("MATCH(" . $fields . ") AGAINST('" . $q . "' IN BOOLEAN MODE)");
}
public static function getFields()
{
$field_names = array();
$disallowed = array('id', 'created_at', 'updated_at', 'deleted_at');
$columns = DB::select('SHOW COLUMNS FROM accounts');
foreach ($columns as $c) {
$field = $c->Field;
if ( ! in_array($field, $disallowed)) {
$field_names[$field] = $field;
}
}
return $field_names;
}
我想要幫助修改上面的代碼,以允許用戶使用部分單詞和短語來搜索字段。 例如,如果用戶鍵入purple,我希望搜索還查找包含電子郵件地址包含單詞purple的任何記錄,因此為info@purplegriffon.com。 因此,基本上是部分匹配。
我還希望能夠在字段中為鍵入的短語john griffon找到所有包含griffon的內容,即使john不存在也是如此。
誰能幫我這個忙嗎? 干杯。
好的,通過FULLTEXT搜索並使用通配符運算符搜索部分,可以使其發揮最大的作用。 這可能不是最佳解決方案,但它可以工作。
public function scopeSearch($query, $q)
{
$fields = Static::getFields();
$fields = implode(', ', $fields);
$terms = explode(' ', $q);
if (count($terms) > 1) {
$query->whereRaw("MATCH(" . $fields . ") AGAINST ('" . $q . "' IN BOOLEAN MODE)");
} else {
foreach ($terms as $term) {
$query->whereRaw("MATCH(" . $fields . ") AGAINST ('*" . $term . "*' IN BOOLEAN MODE)");
}
}
}
public static function getFields()
{
$field_names = array();
$disallowed = array('id', 'country_id', 'created_at', 'updated_at', 'deleted_at');
$columns = DB::select('SHOW COLUMNS FROM venues');
foreach ($columns as $c) {
$field = $c->Field;
if ( ! in_array($field, $disallowed)) {
$field_names[$field] = $field;
}
}
return $field_names;
}
如果有人可以簡化或改進它,那么我很樂意看到它。 干杯。
我得到了解決方案:
$terms = mysql_real_escape_string($terms);
$contact_results = Contact::where_account_user_id(Auth::user()->account_user_id)
->raw_where("match (`first`, `last`) against ('{$terms}*' IN BOOLEAN MODE)")
->where_deleted(0)
->paginate(20);
phpconsole($contact_results->results);
return $contact_results;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.