簡體   English   中英

Laravel 4中的MySQL / PHP布爾全文檢索問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM