热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用LaravelSearch扩展包基于Elasticsearch、Algolia以及ZendSearch实现全文搜索功能

使用LaravelSearch扩展包基于Elasticsearch、Algolia以及ZendSearch实现全文搜索功能
Laravel Search扩展包为不同的全文搜索服务提供了统一的API,当前支持的搜索服务包括 ElasticSearch 、 Algolia 和 ZendSearch 。

1、安装

我们通过Composer来安装这个依赖包:

composer require mmanos/laravel-search dev-master

安装完成后,在 config/app.php 中注册服务提供者到 providers 数组:

'providers' => array(    // ...    Mmanos\Search\SearchServiceProvider::class,)

然后添加门面到 aliases 数组:

'aliases' => array(    // ...    'Search' => Mmanos\Search\Facade::class,)

2、配置

发布扩展包自带的配置文件到应用配置目录下:

php artisan vendor:publish

依赖

以下是相关搜索驱动需要的依赖包:

  • ZendSearch : zendframework/zendsearch
  • Elasticsearch : elasticsearch/elasticsearch
  • Algolia : algolia/algoliasearch-client-php

默认 索引

该扩展包提供了简洁的语法来处理默认索引:编辑配置文件中的 default_index 来修改这个值。

3、索引操作

使用这个扩展包处理索引非常简单,只需要为文档提供一个唯一的标识符并指定一个关联数组到该索引即可。

如果你首次访问这个索引不存在,则该索引会自动创建。

索引一个文档

添加一个id为1的默认索引到文档:

Search::insert(1, array(    'title' => 'My title',    'content' => 'The quick brown fox...',    'status' => 'published',));

注:id可能是一个字符串或整型数据,这个id可用于删除记录也可以在搜索结果中返回。

在文档中存储额外的参数

你可以在文档中存储额外的参数以便在后续搜索结果中获取到,这个特性在引用时间戳或其他标识记录时很有用。

Search::insert(    "post-1",    array(        'title' => 'My title',        'content' => 'The quick brown fox...',        'status' => 'published',    ),    array(        'created_at' => time(),        'creator_id' => 5,    ));

注:额外参数并没有被索引但是存储在索引中以便后续获取到。

删除一个文档

可以从索引中通过id删除一个文档:

Search::delete(1);

删除一个索引

Search::deleteIndex();

4、搜索操作

搜索文档

搜索默认索引对应文档中content包含“fox”的所有记录:

$results = Search::search('content', 'fox')->get();

搜索多个字段

$results = Search::search(array('title', 'content'), 'fox')->get();

搜索所有字段

$results = Search::search(null, 'fox')->get();

执行模糊搜索

$results = Search::search('content', 'update', array('fuzzy'=>true))->get();

注:你也可以传递一个介于0和1之间的数值给fuzzy参数,这个数值越接近1表示越相似,默认是0.5

在查询中使用过滤器

你也可以在查询中使用过滤器,过滤器尝试匹配你指定的整个语句:

$results = Search::search('content', 'fox')    ->where('status', 'published')    ->get();

注:如果指定值包含多个单词的话过滤器并不能保证精准匹配整个字段值。

(Geo-Search)位置搜索

有些驱动支持基于位置的搜索:

$results = Search::search('content', 'fox')    ->whereLocation(36.16781, -96.023561, 10000)    ->get();

上述参数分别表示纬度、经度和距离(米)。

注:目前只有 algolia 驱动支持基于位置的搜索,此外需要确保每个索引记录包含本地信息,如:_ geoloc => ['lat' => 1.23, 'lng' => 1.23] 。

限制结果集

$results = Search::search('content', 'fox')    ->where('status', 'published')    ->limit(10) // Limit 10    ->get();$results = Search::search('content', 'fox')    ->where('status', 'published')    ->limit(10, 30) // Limit 10, offset 30    ->get();

对结果集进行分页

$paginator = Search::search('content', 'fox')->paginate(15);

限制返回的字段数

$results = Search::select('id', 'created_at')    ->search('content', 'fox')    ->get();

多个搜索和过滤器链

$results = Search::select('id', 'created_at')    ->where('title', 'My title')    ->where('status', 'published')    ->search('content', 'fox')    ->search('content', 'quick')    ->limit(10)    ->get();

删除所有匹配某个查询的文档

Search::search('content', 'fox')->delete();

5、处理多个索引

如果你需要处理多个索引可以在指定索引名后像单个索引一样使用上述方法。添加文档到名为“posts”的索引:

Search::index('posts')->insert(1, array(    'title' => 'My title',    'content' => 'The quick brown fox...',    'status' => 'published',));

查询 content 包含 fox 且 status 为 published 的posts:

$results = Search::index('posts')->search('content', 'fox')    ->where('status', 'published')    ->get();

从posts中删除id为1的文档:

Search::index('posts')->delete(1);

删除所有posts:

Search::index('posts')->deleteIndex();

6、高级查询回调

如果你想要对查询有更多控制,可以在所有条件添加到查询后在查询执行之前添加一个回调函数:

$results = Search::index('posts')->select('id', 'created_at')    ->search('content', 'fox')    ->addCallback(function ($query) {        // Make changes to $query...        return $query;    })    ->get();

由于每个驱动都有其自己的 $query 对象/数组,你可以只为某一个驱动执行回调:

$results = Search::index('posts')->select('id', 'created_at')    ->search('content', 'fox')    ->addCallback(function ($query) {        // Adjust pagination for an elasticsearch query array.        $query['from'] = 0;        $query['size'] = 20;        return $query;    }, 'elasticsearch')    ->get();

注:你也可以传递一个驱动数组作为第二个参数。

推荐阅读
  • MACElasticsearch安装步骤及验证方法
    本文介绍了MACElasticsearch的安装步骤,包括下载ZIP文件、解压到安装目录、启动服务,并提供了验证启动是否成功的方法。同时,还介绍了安装elasticsearch-head插件的方法,以便于进行查询操作。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了使用postman操作ElasticSearch的步骤,包括下载安装postman、发送http请求给ElasticSearch、添加索引等操作。详细介绍了postman的安装和配置,以及如何使用postman发送http请求给ElasticSearch,并添加索引。通过本文的指导,读者可以快速上手使用postman操作ElasticSearch。 ... [详细]
  • ElasticSearch成功安装完毕。 测试数据添加出现{  error:{    root_cause ... [详细]
  • Windows简单部署Exceptionless
    部署准备Elasticsearch、Exceptionless.API、Exceptionless.UI、URLRewrite、.NET运行时 1、安装ElasticSearch1 ... [详细]
  • 本文介绍了《中秋夜作》的翻译及原文赏析,以及诗人当代钱钟书的背景和特点。通过对诗歌的解读,揭示了其中蕴含的情感和意境。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文描述了作者第一次参加比赛的经历和感受。作者是小学六年级时参加比赛的唯一选手,感到有些紧张。在比赛期间,作者与学长学姐一起用餐,在比赛题目中遇到了一些困难,但最终成功解决。作者还尝试了一款游戏,在回程的路上感到晕车。最终,作者以110分的成绩取得了省一会的资格,并坚定了继续学习的决心。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
author-avatar
中域信和通信技术_229
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有