laravel Scout包在elasticsearch中的应用

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介:

laravel Scout包在elasticsearch中的应用

laravel的Scout包是针对自身的Eloquent模型开发的基于驱动的全文检索引擎。意思就是我们可以像使用ORM一样使用检索功能。不管你用的是什么搜索引擎,scout包给你封装好了几个方法

use Laravel\Scout\Builder;

abstract public function update($models);
abstract public function delete($models);
abstract public function search(Builder $builder);
abstract public function paginate(Builder $builder, $perPage, $page);
abstract public function map($results, $model);

你只需要创建一个引擎(比如es引擎)就可以使用orm来操作search了。

可惜laravel的scout包只提供了Algolia的驱动。我个人很喜欢的es并没有提供驱动。好在网上有人分享了驱动,比如 https://github.com/ErickTamayo/laravel-scout-elastic

看里面的代码,其实很简单,两个类,一个类ElasticsearchEngine用于实现Scout定义的几个方法,一个类ElasticsearchProvider用于做服务注册。我们使用composer require就能用好这个类了。这里就不说了。

scout包在es中的存储

说说laravel的scout包在es里面是怎么存储的。首先,在配置文件里面elasticsearch创建一个index

    'driver' => env('SCOUT_DRIVER', 'elasticsearch'),

    ...    
    'elasticsearch' => [
        'index' => env('ELASTICSEARCH_INDEX', 'laravel'),
        'hosts' => [            
            env('ELASTICSEARCH_HOST', 'http://localhost'),
            ],
        ],
    ...

然后每个对应的model都是不同的type。这个type的名字是在model里面定义的。

class Post extends Model
use Laravel\Scout\Searchable;

class Post extends Model
{
    use Searchable;

    protected $table = "posts";

    /*
     * 搜索的type
     */
    public function searchableAs()
    {
        return 'posts_index';
    }

    public function toSearchableArray()
    {
        return [
            'title' => $this->title,
            'content' => $this->content,
        ];
    }

所以它里面每个条目实际上是这么一个结构:

我自己用的几点体验:

1 scout会很聪明把表的主键作为es的_id

这个真是非常赞,不需要存储一个id,做_id和id的关联了

2 scout在model做增删改查的时候会自动更新索引

这个也是我们最需要的,索引数据和数据库数据的同步使用代码进行保证了。当然,用代码保证可能并不是什么很好的方法,但是对于小型的网站来说,这个无疑增加了便捷性。

3 scout的建立索引方法是一个网站统一一个index, 不同的model使用不同的type

这种一个index多type的形式是否适用你的项目呢?不一定,如果你的model各不相同,可能多个index更好点。关于index和type的选择,https://www.elastic.co/blog/index-vs-type 可以参考这篇。所以这种方式可能更适合的是存储到es的都是文本的搜索。

4 search函数里面不能指定搜索字段

比如我的Post索引存入了title和content。那么我使用Post::search("china")的时候,搜索出来的结果就是title和content中包含有china的。如果我想搜索content中包含有"china"的,没办法,scout做不到,只能自己做扩展了。

5 分页指定了查询的字段名必须是query

这个意思是在搜索接口,你上交上来的查询接口必须是query=xx,形如http://127.0.0.1:8000/posts/search?query=china
看了源码发现这个query字段是由Scout/Builder写死在代码里面的...这个估计很多人用到这个分页的时候会踩进去

6 搜索的query强制使用通配符

这个是laravel-scout-elasticsearch的问题了,它在query的时候强制在搜索的前后使用上了通配符*,这个在标准分词器中文搜索的时候会出现问题,会变成一个词,具体问题可以看这个帖子:http://elasticsearch.cn/question/228

所以如果要使用标准分词器,需要把query的前后两个*都去掉,具体代码在vendor/tamayo/laravel-scout-elastic/src/ElasticsearchEngine.php中。

总结

scout还是主要偏向于统一搜索接口,如果你的网站很小,并且搜索只是作为文本搜索的话,那么用这个是非常合适的,但是如果你的搜索功能占你的网站大部分功能的话,那么我建议我们可以使用scout做搜索和数据库的同步,其他的搜索请求,我们使用elasticsearch/elasticsearch自己写比较好。


本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/p/6668847.html,如需转载请自行联系原作者

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
7月前
|
运维 监控 Java
探索Elasticsearch在Java环境下的全文检索应用实践
【6月更文挑战第30天】在大数据背景下,Elasticsearch作为分布式搜索分析引擎,因其扩展性和易用性备受青睐。本文指导在Java环境中集成Elasticsearch,涉及安装配置、使用RestHighLevelClient连接、索引与文档操作,如创建索引、插入文档及全文检索查询。此外,还讨论了高级查询、性能优化和故障排查,帮助开发者高效处理非结构化数据全文检索。
194 0
电子书阅读分享《Elasticsearch全观测技术解析与应用(构建日志、指标、APM统一观测平台)》
电子书阅读分享《Elasticsearch全观测技术解析与应用(构建日志、指标、APM统一观测平台)》
|
自然语言处理 监控 搜索推荐
Elasticsearch的应用场景
Elasticsearch的应用场景
|
4月前
|
机器学习/深度学习 存储 监控
Elasticsearch 在日志分析中的应用
【9月更文第2天】随着数字化转型的推进,日志数据的重要性日益凸显。日志不仅记录了系统的运行状态,还提供了宝贵的洞察,帮助企业改进产品质量、优化用户体验以及加强安全防护。Elasticsearch 作为一个分布式搜索和分析引擎,因其出色的性能和灵活性,成为了日志分析领域的首选工具之一。本文将探讨如何使用 Elasticsearch 作为日志分析平台的核心组件,并详细介绍 ELK(Elasticsearch, Logstash, Kibana)栈的搭建和配置流程。
417 4
|
2月前
|
存储 SQL 监控
|
2月前
|
自然语言处理 监控 数据可视化
|
3月前
|
人工智能
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
187 2
|
8月前
|
缓存 关系型数据库 Java
不要将数据库中的“分库分表”理论盲目应用到 Elasticsearch
不要将数据库中的“分库分表”理论盲目应用到 Elasticsearch
63 0
|
5月前
|
存储 自然语言处理 API
Elasticsearch 在语音识别领域的应用
【8月更文第28天】随着语音助手和智能设备的普及,语音识别技术已经成为人们日常生活中不可或缺的一部分。Elasticsearch 作为一种高性能的搜索和分析引擎,在语音识别领域可以发挥重要作用,尤其是在提供快速准确的语音搜索结果方面。本文将介绍如何利用 Elasticsearch 来增强语音识别系统的搜索能力,并通过示例代码展示具体实现。
111 0
|
5月前
|
机器学习/深度学习 自然语言处理 搜索推荐
构建智能搜索应用:Elasticsearch与自然语言处理的融合
【8月更文第28天】随着大数据和人工智能技术的发展,用户对搜索应用的需求已经从简单的关键词匹配转向了更加智能化、人性化的交互方式。本文将探讨如何利用Elasticsearch和自然语言处理(NLP)技术构建一个能够理解用户意图并提供精准搜索结果的智能搜索系统。
416 0