【发布时间】:2017-09-01 16:34:45
【问题描述】:
Laravel Scout:有没有办法只在特定领域进行搜索?
目前这条线工作正常:
$es = Element::search($q)->get();
但它会搜索 title、shortdescription 和 description 字段。我需要它只在 title 字段中搜索。
【问题讨论】:
标签: laravel-scout
Laravel Scout:有没有办法只在特定领域进行搜索?
目前这条线工作正常:
$es = Element::search($q)->get();
但它会搜索 title、shortdescription 和 description 字段。我需要它只在 title 字段中搜索。
【问题讨论】:
标签: laravel-scout
您只需要通过添加以下代码来更改您的模型中的 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;
享受吧!
【讨论】:
array_merge() 将失败。 var $related 本身不是一个数组,需要像 $related->all() 一样返回一个数组。
\App\User::all()->map->only('name')->all()。但是如果你只有一个模型实例,你只需要像这样的 ->only() 方法:\App\User::first()->only('name').
对于 meilisearch 这很有效
Element::search('test',
function ($searchEngine, string $query, array $options) use ($filter) {
$searchEngine->resetSearchableAttributes();
$searchEngine->updateSearchableAttributes(['field_name']);
return $searchEngine->search($query, $options);
}
)
【讨论】:
您可以通过向 scout builder 实例添加回调函数来做到这一点,
Person::search($searchString)->query(function($query) {
$query->select(['title']);
})->get();
【讨论】:
您可以通过向 scout builder 实例添加回调函数来做到这一点,
Person::search($searchString)->query(function($query) {
$query->addSelect(['title']);
})->get();
工作于laravel 7
【讨论】: