laravel Scout包在elasticsearch中的应用

2017-04-05 15:14 by 轩脉刃, ... 阅读, ... 评论, 收藏, 编辑

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自己写比较好。

laravel Scout包在elasticsearch中的应用相关推荐

  1. Laravel Scout 包在 Elasticsearch 中的使用记录

    按照Laravel中文文档安装并且配置scout扩展 laravel scout中文文档链接 如果不用Algolia驱动可以使用这个驱动 https://github.com/ErickTamayo/ ...

  2. Laravel5.4中文分词搜索-使用 Laravel Scout,Elasticsearch,ik 分词(三)

    上一篇地址:https://blog.csdn.net/huangfenhu/article/details/94009241 创建一个文章表和文章模型: php artisan make:model ...

  3. Laravel5.4中文分词搜索-使用 Laravel Scout,Elasticsearch,ik 分词(二)

    上一篇环境搭建地址:https://blog.csdn.net/huangfenhu/article/details/94004316 安装Scout 进入laravel项目的根目录使用compose ...

  4. 简单几步写一个laravel扩展包

    为什么80%的码农都做不了架构师?>>>    laravel使用composer来管理扩展包,理解composer和laravel的开发模式,可以通过简单的几个步骤,快速写出一个l ...

  5. php传值到模板,laravel 实现向公共模板中传值 (view composer)

    view composers 与视图有关,用在一个service provider 的boot()函数里,就是让一个view加载的时候,由于view composer的作用,去调用某个函数传个参啊啥的 ...

  6. 使用logstash将Mysql中的数据导入到ElasticSearch中(详细步骤,win_Elasticsearch)

    在之前转载的一腾讯高级工程师<一文彻底了解Logstash>对logstach有这详细的介绍,这里我只说明一下,将mysql中的数据使用logstash导入到es中,如何操作,具体步骤见下 ...

  7. php框架使用教程,php框架laravel excel包使用教程介绍

    Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP了,下面我们来看看larave ...

  8. 【Elasticsearch】Elasticsearch中数据是如何存储的

    1.概述 转载:Elasticsearch中数据是如何存储的 前言 很多使用Elasticsearch的同学会关心数据存储在ES中的存储容量,会有这样的疑问:xxTB的数据入到ES会使用多少存储空间. ...

  9. 【Elasticsearch】 Elasticsearch中数据是如何存储的

    1.概述 转载:https://elasticsearch.cn/article/6178 转载防丢失 前言 很多使用Elasticsearch的同学会关心数据存储在ES中的存储容量,会有这样的疑问: ...

最新文章

  1. python 列表拼接_【Python杂货铺】速学python基础
  2. 一个数据包的旅程_数据科学语言的个人旅程
  3. CISC, RISC 探究
  4. 常见的大数据安全5个问题和解决策略
  5. UEFI win7系统的安装
  6. web安全day33:人人都要懂的LNMP--nginx的配置和文件理解
  7. 如何使用 iCloud 钥匙串从 macOS Monterey 导入和导出密码?
  8. linux下python、django框架的配置
  9. VS2012配置FreeImage
  10. ant jsch.jar - 一个错误及解决办法
  11. 不挖坑比努力填坑更值得
  12. Python+Matplotlib科研绘图
  13. opencv边缘检测 roberts算子
  14. oracle 抽样_[转载]利用ORACLE实现数据抽样
  15. 电脑路由器,怎么把自己的电脑变成路由器
  16. 视频格式怎么转换,将mp4格式转为mov格式
  17. Facebook跨境电商广告投放入门篇
  18. 什么是“ Windows Shell体验主机”,为什么在我的PC上运行?
  19. 将netcore发布到docker的其他端口上
  20. 涨点利器:推荐系统中对双塔模型的各种改造升级(上)

热门文章

  1. Elasticsearch启动问题:max number of threads [XXX] for user [XX] is too low, increase to at least [4096]
  2. oracle11g在linux7的静默安装脚本
  3. 借鉴美团文章实现的动态线程池,已开源
  4. 产权:使用权、收益权和转让权
  5. Java枚举的打印_如何在java中打印所有枚举值?
  6. 如何开好项目启动大会
  7. x64dbg安装xAnalyzer插件失败问题解决
  8. 如若,我是这样的女子
  9. Android中65536问题剖析
  10. “法外狂徒”为什么那么多?用程序来告诉你!