【问题标题】:Laravel Scout: only search in specific fieldsLaravel Scout:仅搜索特定字段
【发布时间】:2017-09-01 16:34:45
【问题描述】:

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

目前这条线工作正常:

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

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

【问题讨论】:

    标签: laravel-scout


    【解决方案1】:

    您只需要通过添加以下代码来更改您的模型中的 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() 一样返回一个数组。
    • 代码在发布前经过测试。也许 Laravel 已经在新版本中更新了它。我会尝试更新答案。感谢您的报告!
    • 我刚刚在这里测试了一下,没有失败。 ->only() 方法无论如何都会返回一个数组。
    • 我测试了“php”:“^7.3”和“laravel/framework”:“^6.0”。对我不起作用,必须使用 all()
    • 如果你有一个集合,你需要映射它,然后像这样使用 ->only() 方法:\App\User::all()->map->only('name')->all()。但是如果你只有一个模型实例,你只需要像这样的 ->only() 方法:\App\User::first()->only('name').
    【解决方案2】:

    对于 meilisearch 这很有效

    Element::search('test',
        function ($searchEngine, string $query, array $options) use ($filter) {
            $searchEngine->resetSearchableAttributes();
            $searchEngine->updateSearchableAttributes(['field_name']);
            return $searchEngine->search($query, $options);
        }
    )
    

    【讨论】:

    • $searchEngine->updateSearchableAttributes(['*']);可能无法立即工作
    • 使用应用程序(\Laravel\Scout\EngineManager::class)->forgetDrivers();
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      工作于laravel 7

      【讨论】:

        猜你喜欢
        • 2018-12-12
        • 2021-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-03
        • 2019-11-23
        • 2017-04-30
        • 1970-01-01
        相关资源
        最近更新 更多