elasticsearch 及laravel中的使用

elasticsearch-laravel

1. 概念

1. 什么是ES

Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene 基础之上。然而,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确的形容:

  • 一个分布式的实时文档存储,每个字段 可以被索引与搜索
  • 一个分布式实时分析搜索引擎
  • 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据

2. 基本概念

1. 索引(Index)

​ Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。索引是很多文档的集合,这些文档都具备一些相似的特征。例如,你可以分别创建客户,产品目录和其他数据的索引。索引是通过名字(必须是小写的)区分的,当执行索引,搜索,更新和删除操作时,这个名字将会被用来引用实际的索引。

2. 类型(Type)

​ 你可以在索引中定义一个或多个类型。类型是索引的一个逻辑分类或划分,它的概念完全取决于你自己如何去理解。通常,类型是为一些具备公共字段的文档定义的。例如,假想你在运行一个博客平台,并且把其全部的数据都存储索引中。你可以在索引中定义一个用于保存用户数据的类型,另一个用于保存博客数据的类型,还有一个用于保存评论数据的类型。在 7.x 以上的版本逐渐去掉类型

3. 文档(Document)

​ 文档是可以被索引的基本单位。例如,你可以用一个文档保存单个客户的数据,另一个文档保存单个产品的数据,还有一个文档保存单个订单的数据。文档使用一种互联网广泛存在的数据交换格式保存-JSON。

你可以在索引/类型中存储大量你想存储的数据。值得注意的是,尽管文档本质上是存放在索引中,但实际上是被索引到索引中的一个类型中。

4. 节点(Node)

​ 节点是一个服务器,也是集群的一部分,它存储你的数据,并参与集群的索引和搜索。和集群一样,节点也是通过唯一的名字去区分,默认名字是一个随机的UUID,当服务器启动的时候就会设置到节点。你也可以自定义节点的名称。名称对管理员来说十分重要,它可以帮助你辨认出集群中的各个服务器和哪个节点相对应。

5. 集群(Cluster)

​ 集群是一个或多个节点(服务器)的集合,它们联合起来保存所有的数据(索引以分片为单位分散到多个节点上保存)并且可以在所有的节点上进行索引和搜索操作。集群通过一个唯一的名字区分,默认的名字是“elasticsearch”。这个名字十分重要,因为一个节点仅仅可以属于一个集群,并根据集群名称加入集群。

2. 安装

1. windows 安装启动

  • java环境安装

​ 由于elasticsearch是基于java运行的,在安装elasticsearch之前必须安装java运行环境

​ 从Oracle 官网下载并安装对应的java环境

​ 将java添加到环境变量

  • elasticsearch 下载安装

​ 从官网下载elasticsearch最新的版本

​ 下载后解压缩,进入bin目录

​ 运行elasticsearch.bat文件即可启动elasticsearch服务

​ 默认启动端口为 9200 , 访问地址 127.0.0.1:9200 即可看见elasticsearch的启动信息

  • Kibana 下载安装

​ 从官网下载与elasticsearch 对应的Kibana版本(必须与elasticsearch版本一致方可启动)

​ 下载后解压缩,进入bin目录

​ 运行Kibana.bat文件启动Kibana服务

​ 默认启动端口为 5600 , 浏览器输入127.0.0.1:5600即可访问

  • IK 中文分词器安装

​ 从GitHub下载分词器对应版本(与elasticsearch版本保持一致)

​ 解压缩后移动到 elasticsearch 的 plugins 文件夹下并重命名为ik

​ 重新启动elasticsearch服务即可使用 IK 中文分词器

2. Linux 安装启动

3. 分词

1. 自定义分词器

对于逗号分割的标签字段自定义通过逗号分词的分词器

PUT /zsj/?pretty
{
"settings": {
  "index": {
    "number_of_shards": "1",
    "number_of_replicas": "1"
  },
  "analysis": {
        "analyzer": {
            "comma": {
                 "type": "pattern",
                 "pattern":","
                }
            }
        }
    }
}

4. laravel开发过程

1. 下载安装扩展驱动

安装laravel/scout

安装ElasticSearch laravel 驱动

配置ES驱动

1. 安装 laravel/scout

参考laravel文档

2. 安装 ElasticSearch 驱动

参考GitHub

3. 配置 ES 驱动

'driver' => env('SCOUT_DRIVER', 'elasticsearch'),
  //增加一个驱动
 'elasticsearch' => [
         'index' => env('ELASTICSEARCH_INDEX', 'laravel56_shop'),
         'hosts' => [
             env('ELASTICSEARCH_HOST', 'http://127.0.0.1:9200'),
         ],
  ],

2. 创建模板和索引

创建索引和模板的配置文件

使用laravel命令行生成模板和索引

1. 创建Command命令

php artisan make:command ESInit会生成一个 Console/Commands 文件夹和 ESInit.php 的文件

2. 编辑文件handle函数
 [
                'template' => config('scout.elasticsearch.index'),
                'mappings' => [
                    '_default_' => [
                        'dynamic_templates' => [
                            [
                                'strings' => [
                                    'match_mapping_type' => 'string',
                                    'mapping' => [
                                        'type' => 'text',
                                        'analyzer' => 'ik_smart',
                                        'fields' => [
                                            'keyword' => [
                                                'type' => 'keyword'
                                            ],
                                        ],
                                    ],
                                ],
                            ]
                        ],
                    ],
                ],
            ],
        ];
        //想URL发送参数创建template
        $client->put($url, $params);
        //做记录 显示在命令行
        $this->info('============ 创建模板成功 ==============');

        //创建index
        $url = config('scout.elasticsearch.hosts')[0] . '/' . config('scout.elasticsearch.index');
        $params = [
            'json' => [
                'settings' => [
                    'refresh_interval' => '5s',
                    'number_of_shards' => 1,
                    'number_of_replicas' => 0,
                ],
                'mappings' => [
                    '_default_' => [
                        '_all' => [
                            'enabled' => false
                        ],
                    ],
                ],
            ],
        ];
        $client->put($url, $params);
        $this->info('============ 创建索引成功 ==============');
    }
}
3. 挂载命令

编辑 App\Console\Kernel.php 文件

/**
     * 将ESInit类加入到 protected $commands数据中
     *
     * @var array
     */
    protected $commands = [
        ESinit::class
    ];

使用 php artisan 查看命令是否已生成

使用 php artisan es:init 命令为 ES 生成模板和索引

3. 数据写入和同步更新

1. 创建要同步的数据的表模型

创建 product 表模型

 $this->title,
            'descr' => $this->descr
        ];
    }
}

2. 使用scout导入数据

php artisan scout:import "App\Models\Product"

5. 查询方法

1. 一般查询

查询所有数据

GET /zsj/_search
{
  "size": 2000
}

通过字段匹配查询

GET /zsj/_search
{
  "query": {
    "match": {
      "author": "joker · 小丑"
    }
  }
}

多字段联合查询和过滤

GET /zsj/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "subject": {
              "query": "林_Linplustar",
              "boost": 1.2
            }
          }
        },
        {
          "match": {
            "tags": {
              "query": "林_Linplustar",
              "boost": 2.0
            }
          }
        },
        {
          "match_phrase": {
            "author": {
              "query": "林_Linplustar",
              "boost": 40.0
            }
          }
        },
        {
          "match_phrase": {
            "big_class": {
              "query": "林_Linplustar",
              "boost": 6.0
            }
          }
        },
        {
          "match_phrase": {
            "small_class": {
              "query": "林_Linplustar",
              "boost": 3.0
            }
          }
        }
      ],
      "must": [
        {
          "range": {
            "displayorder": {
              "gte": 0
            }
          }
        },
        {
          "range": {
            "dateline": {
              "gte": 1497954476
            }
          }
        },
        {
          "range": {
            "digest": {
              "gte": 0
            }
          }
        }
      ]
    }
  },
  "size": 500
}

2. 其他查询

查询某个字段的分词情况

GET zsj/thread/{id}/_termvectors?fields={field}

你可能感兴趣的:(elasticsearch 及laravel中的使用)