我有以下代码,可以在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的任何记录,因此为[email protected]。因此,本质上是部分匹配。

我还希望能够在字段中为键入的短语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;
}


如果有人可以简化或改进它,那么我很乐意看到它。干杯。

09-13 06:41