1. Elasticsearch 的基础概念

Elasticsearch 是一个非常灵活和强大的搜索引擎,涉及到非常多的概念,为了降低入门门槛,这里先给大家介绍 Elasticsearch 最最基础的一些概念。

Elasticsearch 本质上是一个数据库,但并不是 Mysql 这种关系型数据库,查询语言也不是 SQL,而且 Elasticsearch 自己的一套查询语言。

既然是数据库,有一些概念是互通的,如下表:

Mysql Elasticsearch
数据库(Database) 索引(Index)
表(Table) 类型(Type)
记录(Row) 文档(Document)
字段(Column) 字段(Fields)

其中 Elasticsearch 的类型(Type)在 6.x 版本中已经被标记为 Deprecated (废弃)并将在 7.x 版本中移除

6.x 版本的文档建议一个索引(Index)中只放一个类型(Type),可以简单理解为一个数据库中只包含一个表。这是因为在 Elasticsearch 的底层实现中,假如我们在 Type A 中定义了一个名为 status 的 integer 类型字段,在同一个 Index 下的另一个 Type B 如果也有 status 字段,那么 Type B 的 status 字段的类型也必须为 integer,否则 Type B 都无法被创建。

为了遵循这个建议,在我们之后创建的所有 Index 都将只包含一个 Type,并统一命名为 _doc

2. 一些基础操作

1.产看版本

2.创建索引

2.1删除索引

3.查看索引类型

3.1查看所有索引

4.创建类型(type) 7.0已废弃

接下来我们将在刚刚创建的索引中创建一个新的类型,对应的接口地址是 /{index_name}/_mapping/{type_name}

5.创建文档(相当于mysql里的一条数据)

6.获取指定文档

7.简单的搜索

1.引入composer扩展包

2.配置

config/database.php

.env

.env.example

3.服务注册初始化 Elasticsearch 对象

app/Providers/AppServiceProvider.php

4.创建索引

由于查询的不支持嵌套,注意看 skus.title 字段的定义里加入了 copy_to 参数,值是 skus_title,Elasticsearch 就会把这个字段值复制到 skus_title 字段里, skus_title 这个字段不需要自己手动创建,这样就可以在 multi_match 的 fields 里通过 skus_title 来匹配。skus.description 和 properties.name 同理。

创建成功返回

5.测试

6.将数据转化为数组,准备填充到索引当中

填充格式↓

7.创建命令调用toESArray方法,一键填充到Elasticsearch

app/Console/Commands/Elasticsearch/SyncProducts.php

执行命令

查看导入的数据

8.创建队列时时更新数据

app/Jobs/SyncOneProductToES.php

在更改数据的地方使用队列

app/Admin/Controllers/CommonProductsController.php

执行队列更新商品数据,测试一下