文档章节

Laravel ES搜索

麦拂沙
 麦拂沙
发布于 2017/05/25 05:44
字数 1256
阅读 242
收藏 0

ElasticSearch服务

基于Docker服务安装 >>


elasticsearch官方包

所有参数(uri、document body)传递均使用索引数组

安装

composer require elasticsearch/elasticsearch:~2.0

使用

$client = Elasticsearch\ClientBuilder::create()->build();

## 创建索引 ##
#请求:
$response = $client->indices()->create([
    'index' => 'my_index',
    'body' => [
        'settings' => [
            'number_of_shards' => 2,
            'number_of_replicas' => 0
        ]
    ]
]);
#响应:
[
	'acknowledged' => 1
]

## 索引文档 ##
#请求:
$response = $client->index([
    'index' => 'my_index',
    'type' => 'my_type',
    'id' => 'my_id',
    'body' => ['welcome' => 'hello world']
]);
#响应:
[
	'_index' => 'my_index',
	'_type' => 'my_type',
	'_id' => 'my_id',
	'_version' => '1',
	'created' => 1,
]

## 检索文档 ##
#请求:
$response = $client->get([
    'index' => 'my_index',
    'type' => 'my_type',
    'id' => 'my_id'
]);
#响应:
[
	'_index' => 'my_index',
	'_type' => 'my_type',
	'_id' => 'my_id',
	'_version' => '1',
	'found' => 1,
	'_source' => [
		'welcome' => 'hello world'
	],
]
# 可调用方法getSource直接获取_source

## 查询文档 ##
#请求:
$response = $client->search([
    'index' => 'my_index',
    'type' => 'my_type',
    'body' => [
        'query' => [
            'match' => [
                'welcome' => 'hello'
            ]
        ]
    ]
]);
#响应:
[
    'took' => 1,
    'timed_out' => '',
    '_shards' => [
        'total' => 5,
        'successful' => 5,
        'failed' => 0,
    ],

    'hits' => [
        'total' => 1,
        'max_score' => 0.30685282,
        'hits' => [
            [
                '_index' => my_index,
                '_type' => my_type,
                '_id' => my_id,
                '_score' => 0.30685282,
                '_source' => [
                    'welcome' => 'hello world',
                ],
            ],
        ],
    ]
]

## 删除文档 ##
#请求:
$response = $client->delete([
    'index' => 'my_index',
    'type' => 'my_type',
    'id' => 'my_id'
]);
#响应:
[
    'found' => 1,
    '_index' => my_index,
    '_type' => my_type,
    '_id' => my_id,
    '_version' => 2,
]

## 删除索引 ##
#请求:
$response = $client->indices()->delete([
    'index' => 'my_index'
]);
#响应:
[
	'acknowledged' => 1
]

Scout包

针对 Eloquent ORM 开发的基于驱动的简易全文检索系统

安装

############################# Scout ###############################
composer require laravel/scout

# 注册providor至config/app.php
Laravel\Scout\ScoutServiceProvider::class,

# 发布配置
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"

# 队列支持(可选,提高应用响应速度)
1. 配置队列
2. 启用队列:config/scout.php 中设置 'queue' => true,

######################## ElasticSearch驱动 ##########################
composer require tamayo/laravel-scout-elastic

# 注册provider至config/app.php
ScoutEngines\Elasticsearch\ElasticsearchProvider::class,

# 配置Scout驱动
'elasticsearch' => [
    'index' => env('ELASTICSEARCH_INDEX', 'laravel'), #索引
    'hosts' => [ #集群节点
        env('ELASTICSEARCH_HOST', 'http://localhost'),
    ],
],

模型配置

  1. 在需要搜索支持的Model中 use Laravel\Scout\Searchable;(注册模型观察者自动保持模型和索引的同步)
  2. 索引名称默认与表名一致(snake模型名s),亦可通过searchableAs方法自定义
  3. 默认索引数据$model->toArray(),亦可toSearchableArray方法自定义

索引全表 -

php artisan scout:import 模型名 #已有数据批量导入索引
php artisan scout:flush  模型名 #批量更新索引

索引结果集 - 默认的,模型在更新时自动toArray()同步到索引,亦可searchable方法手动索引查询结果

# 自动对结果分块并进行索引
$collection->->searchable();

索引删除 - 默认的,模型在删除时自动删除索引,亦可unsearchable方法手动删除查询结果的索引

# 自动对结果分块并删除索引
$collection->->unsearchable();

索引暂停 -

App\Order::withoutSyncingToSearch(function(){
    //模型所有更新操作将关停索引同步
});

索引查询 -

# where仅支持数字相等查询,用于处理范围查询
模型::search($keyword)->where()->get()
模型::search($keyword)->where()->paginate([$num])

思考
Scout搭建简单快捷,在数据和索引的自动同步上提供了极大的便利性;
但是Scout的搜索功能过于简单,无法彻底发挥ES的强大功能;


Elasticquent包

映射Eloquent ModelElasticsearch Type

由于Scout包诸多欠缺性, 要充分发挥ES的强大功能, 我们可以结合使用Elasticquent包做搜索增强,具体的:

  • Elasticquent包负责索引查询
    • 配置Mapping
    • 进行DSL复合查询
  • Scout包负责索引更新、删除
    • 数据和索引的自动同步

安装

composer require elasticquent/elasticquent:dev-master

# 注册providor、facad至config/app.php
Elasticquent\ElasticquentServiceProvider::class,
'Es' => Elasticquent\ElasticquentElasticsearchFacade::class,

# 发布配置
php artisan vendor:publish --provider="Elasticquent\ElasticquentServiceProvider"

模型配置

use Elasticquent\ElasticquentTrait;

# 自定义分析器
protected $indexSettings = [
    'analysis' => [
        'filter' => [
            'synonym' => [
                'type' => 'synonym', # ES内置的同义词过滤器
                'synonyms' => ['you,你', 'I,me=>我'],
                #'synonyms_path' => 'synonym.txt', 可选同义词文件(必须存在集群的每个节点上)
            ],
            'keyword_filter' => [
                'type' => 'ngram', # ES内置的汉语模型过滤器(用于生成部分匹配或者自动补全的词条)
                'min_gram' => 1,
                'max_gram' => 20,
            ],
        ],
        'analyzer' => [
            'default' => [
                'type' => 'custom', #或者不用自定义analyser,直接使用ik_max_word
                'char_filter' => ['html_strip'],
                'tokenizer' => 'ik_max_word',
                'filter' => [
                    'lowercase',
                    'synonym',
                    'keyword_filter',
                ],
            ],
        ],
    ],
];

# 自定义Mapping
protected $mappingProperties = array(
    'id' => ['type' => 'integer'],
    'title' => ['type' => 'string'],
    'tag' => ['type' => 'string', 'index' => 'not_analyzed'],
    'location' => ['type' => 'geo_point'],
    'childs' => [
        'type' => 'nested',
        'properties' => [
            'id' => ['type' => 'integer'],
        ],
    ],
);

# 自定义索引名(覆盖配置文件中默认索引名)
function getIndexName()
{
    return 索引名;
}

# 自定义类型名(覆盖默认的 snake模型名s)
function getTypeName()
{
    return 类型名;
}

# 自定义索引结构
# 和$mappingProperties属性搭配使用
function getIndexDocumentData()
{
    return array(
        'id'      => $this->id,
        'name'   => 'xxx',
        ...
    );
}

索引管理

  • 索引初始化
# 创建索引
模型::createIndex($shards = null, $replicas = null);

# 根据$mappingProperties属性设置mapping
重设类型:模型::putMapping($ignoreConflicts = true);
删  除:模型::deleteMapping();
重  建:模型::rebuildMapping();
存在性:模型::mappingExists();
读  取:模型::getMapping();

# 检查Type
模型::typeExists();
  • 索引全表
模型::addAllToIndex(); #不会自动分块表数据
模型::reindex(); #重建索引,直接使用ES中_source字段的原始文档数据来重建
  • 索引结果集
# 模型id即为索引id
$collection->->addToIndex();
$model->addToIndex();
  • 索引查询
# term查询精确值
$results = 模型::search($keyword);

# 基本搜索
$results = 模型::searchByQuery(
								array $query = null,
								$aggregations = null,
								$sourceFields = null,
								$limit = null,
								$offset = null,
								$sort = null
		)


# 全文搜索(DSL原生语法)
$results = 模型::complexSearch(array $query)->paginate($pageNum)

# 搜索结果
$results->totalHits(); #匹配文档总量
$results->getAggregations(); #匹配文档聚合信息
$results->shards();
$results->maxScore();
$results->timedOut();
$results->took();


# 搜索结果集的单元
$model->isDocument();
$model->documentScore();

同ES官方包协作

# 原生查询结果转为Eloquent集合
$client = new \Elasticsearch\Client();
$collection = 模型::hydrateElasticsearchResult($client->search($params));

© 著作权归作者所有

麦拂沙
粉丝 22
博文 120
码字总数 109619
作品 1
海淀
高级程序员
私信 提问
laravel Scout包在elasticsearch中的应用

laravel Scout包在elasticsearch中的应用 laravel的Scout包是针对自身的Eloquent模型开发的基于驱动的全文检索引擎。意思就是我们可以像使用ORM一样使用检索功能。不管你用的是什么搜索引擎,...

王二狗子11
2018/01/07
0
0
Voyager 1.0.5 发布,Laravel 后台管理扩展包

Voyager 是一个强大、快捷的 Laravel 后台管理扩展包,提供了 CRUD 操作、媒体管理、菜单构建、数据管理等操作。 Voyager 1.0.5 更新内容: Updates to a few translations (ES, IT, RU) Bug...

王练
2017/10/09
535
1
使用 PHPStorm 开发 Laravel 应用

很多PHP程序员使用 Laravel 创建他们的应用程序。Laravel 是一个免费开源的PHP web应用程序框架。它基于多个Symfony 组件,提供了一个开发框架,包括authentication, routing, sessions, ca...

StevieYu
2015/02/15
14.2K
10
Vuebnb:一个完整??的Vue.js和Laravel应用程序

  这是围绕一个案例研究项目,Vuebnb,一个简单的Airbnb的克隆。在这篇文章中,我将对它是如何工作的一个高层次的概述,以便从头开始构建一个完整的Vue / Laravel应用程序。   这里有一个...

爱前端
2017/12/18
0
0
Laravel5.4实战快速开发自媒体网站教程 Laravel实战教程

第1章 课程介绍 介绍课程的大体脉络和课程安排 第2章 Laravel 5.4介绍 本节课会带领大家介绍laravel的各个版本历史以及讨论php框架的未来发展趋势。把laravel周边的生态环境一一展示。 第3章...

15543595340
2018/05/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

二、Docker

1、Docker - The TLDR(Too Long,Don't Read,Linxu 终端工具 ) Docker是在Linux和Windows上运行的软件。它创建、管理和编排容器。该软件以开源方式开发,在Github上作为Moby开源项目的一部分。...

倪伟伟
23分钟前
2
0
Python猫荐书系列之七:Python入门书籍有哪些?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/ArN-6mLPzPT8Zoq0Na_tsg 最近,猫哥的 Python 技术学习群里进来了几位比较特殊的同学:一...

豌豆花下猫
今天
5
0
Guava RateLimiter限流源码解析和实例应用

在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流 缓存 缓存的目的是提升系统访问速度和增大系统处理容量 降级 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高...

算法之名
今天
13
0
国产达梦数据库与MySQL的区别

背景 由于项目上的需要,把项目实现国产化,把底层的MySQL数据库替换为国产的达梦数据库,花了一周的时间研究了国产的数据库-达梦数据库,它和MySQL有一定的区别,SQL的写法也有一些区别。 ...

TSMYK
今天
2
0
老也有错?35岁程序员是一道坎,横亘在每个技术职场人的心中

随着互联网的高速发展变革,大龄恐惧症越来越多地在技术圈被人讨论。很多程序员在工作5-10年以后,都会开始思考5年、10年甚至更久以后的自己,会是怎样一种生活工作状态,以及是否会被时代抛...

我最喜欢三大框架
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部