10

Laravel Scout:有没有办法只在特定领域进行搜索?

目前这条线工作正常:

    $es = Element::search($q)->get();

但它会搜索titleshortdescriptiondescription字段。我需要它只在标题字段中搜索。

4

4 回答 4

24

toSearchableArray您只需要通过添加以下代码来更改模型中的方法:

/**
 * Get the indexable data array for the model.
 *
 * @return array
 */
public function toSearchableArray()
{
    $array = $this->only('title', 'description');

    $related = $this->user->only('name', 'email');

    // Customize array...

    return array_merge($array, $related);
}

然后调用php artisan scout:import "App\YourModel"以重新索引新记录。 

笔记:

  • $this->only('title', 'description')将仅搜索其标题和描述字段
  • $this->user->only('name', 'email')还将从相关模型中搜索其名称和电子邮件

因此,您可以通过添加->load('user')类似以下代码的搜索方法来检索相关数据:

public function search(Request $request)
{
    $query = $request->get('q');

    return Task::search($query)->get()->load('user');
}

更新

如果您尝试使用 ->paginate() 方法检索数据,则必须单独加载关系:

...
$tasks = Task::search($query)->paginate($request->get('per_page'));

$tasks->load('user');

return $tasks;

享受!

于 2017-11-25T13:20:57.867 回答
0

您可以通过向 scout builder 实例添加回调函数来做到这一点,

Person::search($searchString)->query(function($query) { 
       $query->select(['title']);  
})->get();
于 2021-06-07T17:11:32.410 回答
0

对于 meilisearch 这有效

Element::search('test',
    function ($searchEngine, string $query, array $options) use ($filter) {
        $searchEngine->resetSearchableAttributes();
        $searchEngine->updateSearchableAttributes(['field_name']);
        return $searchEngine->search($query, $options);
    }
)
于 2021-09-16T08:38:05.397 回答
0

您可以通过向 scout builder 实例添加回调函数来做到这一点,

Person::search($searchString)->query(function($query) { 
       $query->addSelect(['title']);  
})->get();

从事laravel 7

于 2021-08-14T10:17:33.330 回答