php操作ElasticSearch搜索引擎流程详解

目录
  • 一、安装
  • 二、使用
  • 三、新建ES数据库
  • 四、创建表
  • 五、插入数据
  • 六、 查询所有数据
  • 七、查询单条数据
  • 八、搜索
  • 九、测试代码

〝 古人学问遗无力,少壮功夫老始成 〞

如果这篇文章能给你带来一点帮助,希望给飞兔小哥哥一键三连,表示支持,谢谢各位小伙伴们。

一、安装

通过composer安装


composer require 'elasticsearch/elasticsearch'

二、使用

创建ES类


<?PHP
 
require 'vendor/autoload.php';
 
//如果未设置密码
$es = \Elasticsearch\ClientBuilder::create()->setHosts(['xxx.xxx.xxx.xxx'])->build();
 
//如果es设置了密码
$es = \Elasticsearch\ClientBuilder::create()->setHosts(['Http://username:passWord@xxx.xxx.xxx.xxx:9200'])->build()

三、新建ES数据库

index 对应关系型数据(以下简称Mysql)里面的数据库,而不是对应mysql里面的索引


<?php
$params = [
    'index' => 'autofelix_db', #index的名字不能是大写和下划线开头
    'body' => [
        'settings' => [
            'number_of_shards' => 5,
            'number_of_replicas' => 0
        ]
    ]
];
$es->indices()->create($params);

四、创建表

  • 在Mysql里面,光有了数据库还不行,还需要建立表,ES也是一样的
  • ES中的type对应MySQL里面的表
  • es6以前,一个index有多个type,就像MySQL中一个数据库有多个表一样
  • 但是ES6以后,每个index只允许一个type
  • 在定义字段的时候,可以看出每个字段可以定义单独的类型
  • 在first_name中还自定义了 分词器 ik,这是个插件,是需要单独安装的

<?php
$params = [
    'index' => 'autofelix_db',
    'type' => 'autofelix_table',
    'body' => [
        'mytype' => [
            '_source' => [
                'enabled' => true
            ],
            'properties' => [
                'id' => [
                    'type' => 'integer'
                ],
                'first_name' => [
                    'type' => 'text',
                    'analyzer' => 'ik_max_word'
                ],
                'last_name' => [
                    'type' => 'text',
                    'analyzer' => 'ik_max_word'
                ],
                'age' => [
                    'type' => 'integer'
                ]
            ]
        ]
    ]
];
$es->indices()->putMapping($params);

五、插入数据

  • 现在数据库和表都有了,可以往里面插入数据了
  • 在ES里面的数据叫文档
  • 可以多插入一些数据,等会可以模拟搜索功能

<?php
$params = [
    'index' => 'autofelix_db',
    'type' => 'autofelix_table',
    //'id' => 1, #可以手动指定id,也可以不指定随机生成
    'body' => [
        'first_name' => '飞',
        'last_name' => '兔',
        'age' => 26
    ]
];
$es->index($params);

六、 查询所有数据


<?php
$data = $es->search();
 
var_dump($data);

七、查询单条数据

  • 如果你在插入数据的时候指定了id,就可以查询的时候加上id
  • 如果你在插入的时候未指定id,系统将会自动生成id,你可以通过查询所有数据后查看其id

<?php
$params = [
    'index' => 'autofelix_db',
    'type' => 'autofelix_table',
    'id' =>  //你插入数据时候的id
];
$data = $es->get($params);

八、搜索

ES精髓的地方就在于搜索


<?php
$params = [
    'index' => 'autofelix_db',
    'type' => 'autofelix_table',
    'body' => [
        'query' => [
            'constant_score' => [ //非评分模式执行
                'filter' => [ //过滤器,不会计算相关度,速度快
                    'term' => [ //精确查找,不支持多个条件
                        'first_name' => '飞'
                    ]
                ]
            ]
        ]
    ]
];
 
$data = $es->search($params);
var_dump($data);

九、测试代码

基于Laravel环境,包含删除数据库,删除文档等操作


<?php
use Elasticsearch\ClientBuilder;
use Faker\Generator as Faker;
 

class EsDemo
{
    private $EsClient = null;
    private $faker = null;
 
    
    private $index = 'autofelix_db';
    private $type = 'autofelix_table';
 
    public function __construct(Faker $faker)
    {
        
        $this->EsClient = ClientBuilder::create()->setHosts(['xxx.xxx.xxx.xxx'])->build();
        
        $this->faker = $faker;
    }
 
    
    public function generateDoc($num = 100) {
        foreach (range(1,$num) as $item) {
            $this->putDoc([
                'first_name' => $this->faker->name,
                'last_name' => $this->faker->name,
                'age' => $this->faker->numberBetween(20,80)
            ]);
        }
    }
 
    
    public function delDoc($id) {
        $params = [
            'index' => $this->index,
            'type' => $this->type,
            'id' =>$id
        ];
        return $this->EsClient->delete($params);
    }
 
    
    public function search($query = [], $from = 0, $size = 5) {
//        $query = [
//            'query' => [
//                'bool' => [
//                    'must' => [
//                        'match' => [
//                            'first_name' => 'Cronin',
//                        ]
//                    ],
//                    'filter' => [
//                        'range' => [
//                            'age' => ['gt' => 76]
//                        ]
//                    ]
//                ]
//
//            ]
//        ];
        $params = [
            'index' => $this->index,
//            'index' => 'm*', #index 和 type 是可以模糊匹配的,甚至这两个参数都是可选的
            'type' => $this->type,
            '_source' => ['first_name','age'], // 请求指定的字段
            'body' => array_merge([
                'from' => $from,
                'size' => $size
            ],$query)
        ];
        return $this->EsClient->search($params);
    }
 
    
    public function getDocs($ids) {
        $params = [
            'index' => $this->index,
            'type' => $this->type,
            'body' => ['ids' => $ids]
        ];
        return $this->EsClient->mget($params);
    }
 
    
    public function getDoc($id) {
        $params = [
            'index' => $this->index,
            'type' => $this->type,
            'id' =>$id
        ];
        return $this->EsClient->get($params);
    }
 
    
    public function updateDoc($id) {
        $params = [
            'index' => $this->index,
            'type' => $this->type,
            'id' =>$id,
            'body' => [
                'doc' => [
                    'first_name' => '张',
                    'last_name' => '三',
                    'age' => 99
                ]
            ]
        ];
        return $this->EsClient->update($params);
    }
 
    
    public function putDoc($body = []) {
        $params = [
            'index' => $this->index,
            'type' => $this->type,
            // 'id' => 1, #可以手动指定id,也可以不指定随机生成
            'body' => $body
        ];
        $this->EsClient->index($params);
    }
 
    
    public function delAllIndex() {
        $indexList = $this->esStatus()['indices'];
        foreach ($indexList as $item => $index) {
            $this->delIndex();
        }
    }
 
    
    public function esStatus() {
        return $this->EsClient->indices()->stats();
    }
 
    
    public function createIndex() {
        $this->delIndex();
        $params = [
            'index' => $this->index,
            'body' => [
                'settings' => [
                    'number_of_shards' => 2,
                    'number_of_replicas' => 0
                ]
            ]
        ];
        $this->EsClient->indices()->create($params);
    }
 
    
    public function checkIndexExists() {
        $params = [
            'index' => $this->index
        ];
        return $this->EsClient->indices()->exists($params);
    }
 
    
    public function delIndex() {
        $params = [
            'index' => $this->index
        ];
        if ($this->checkIndexExists()) {
            $this->EsClient->indices()->delete($params);
        }
    }
 
    
    public function getMapping() {
        $params = [
            'index' => $this->index
        ];
        return $this->EsClient->indices()->getMapping($params);
    }
 
    
    public function createMapping() {
        $this->createIndex();
        $params = [
            'index' => $this->index,
            'type' => $this->type,
            'body' => [
                $this->type => [
                    '_source' => [
                        'enabled' => true
                    ],
                    'properties' => [
                        'id' => [
                            'type' => 'integer'
                        ],
                        'first_name' => [
                            'type' => 'text',
                            'analyzer' => 'ik_max_word'
                        ],
                        'last_name' => [
                            'type' => 'text',
                            'analyzer' => 'ik_max_word'
                        ],
                        'age' => [
                            'type' => 'integer'
                        ]
                    ]
                ]
            ]
        ];
        $this->EsClient->indices()->putMapping($params);
        $this->generateDoc();
    }
}

到此这篇关于php操作ElasticSearch搜索引擎流程详解的文章就介绍到这了,更多相关php ElasticSearch搜索引擎内容请搜索编程界以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程界!

--结束END--

本文标题: php操作ElasticSearch搜索引擎流程详解

本文链接: https://www.lsjlt.com/news/50.html (转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢

  • php操作ElasticSearch搜索引擎流程详解

    目录一、安装二、使用三、新建ES数据库四、创建表五、插入数据六、 查询所有数据七、查询单条数据八、搜索九、测试代码〝 古人学问遗无力,少壮功夫老始成 〞如果这篇文章能给你带来一点帮助,希望给飞兔小哥哥一键三连,表示支持,谢谢各位小伙伴们。一、安装通过compo
  • PHP操作Elasticsearch7.6

    目录安装操作Elasticsearch的PHP库PHP连接Elasticsearch创建索引和映射添加文档单一文档索引批量(bulk)索引获取文档更新文档部分更新script更新删除文档首先打开Elasticsearch官网了解对应编程语言的API https
    阅读数:339 PHP操作Elasticsearch7.6
  • PHP操作ElasticSearch7.8.1 详细教程

    版本PHP 操作 ElasticSearch 的索引,文档PHP版本: 7.1.9ElasticSearch版本:7.8.1ElasticSearch-PHP根据 PHP 版本选择对应的 Ela
    阅读数:3 ElasticSearch php
  • php+elasticsearch查询

    最近有些地方用到了搜索,但是搜索速度不达意所以使用 es 搜索,因此给自己做个标记,再这里做个记号,以后方便使用,以 windows
    阅读数:13 elasticsearch es查询 php
  • php引擎优化

    php引擎优化6.1.php引擎缓存优化首先,影响php效率的主要有2个因素。其一:libphp5.so需要编译php源代码成为opcode树(操作码);其二:php需要与数据库进行读写,数据库的并发能力很低。于是php缓存
    阅读数:394 php
  • 详解PHP的执行原理和流程

    这篇文章主要介绍了详解PHP的执行原理和流程,对此感兴趣的同学,可以详细看一下
    阅读数:160 PHP 执行原理 PHP 流程
  • PHP操作Redis详解案例

    $redis = new Redis();connect, open 链接redis服务参数host: string,服务地址port: int,端口号timeout: float,链接时长 (可选, 默认为 0 ,不限链接时间)注: 在r
    阅读数:189 redis edi
  • php怎么实现搜索效果

    php实现搜索效果的方法:1、初始化查询条件;2、调用查询方法;3、计算页面显示数据条数;4、在设置的“搜索”菜单中,调用“protected function _search(){...}”搜索方法即可。
    阅读数:537 php 搜索
  • PHP中使用ElasticSearch最新实例讲解

    这篇文章主要介绍了PHP中使用ElasticSearch最新实例讲解,这篇文章的教程是比较详细,有需要的同学可以研究下
  • PHP操作XML的教程详解

    这篇文章主要为大家详细介绍了PHP操作XML的方法,文中的示例代码讲解详细,对我们学习或工作有一定的参考价值,感兴趣的可以了解一下
    阅读数:807 PHP操作XML PHP XML
  • PHP微信支付与退款功能实现流程详解

    本篇文章后端使用的是php,侧重于整个支付的流程和一些细节方面的东西。所以使用其他后端语言的朋友有需要也是可以看一下的。很多时候开发的需求和相应问题的解决真的要跳出语言语法层面,去从系统和流程的角度考虑
  • PHP引擎php.ini参数优化深入讲解

    这篇文章主要介绍了PHP引擎php.ini参数优化深入讲解,php.ini设置可以提高php的响应速度,有感兴趣的同学可以学习下
  • PHP中MySQL操作的Buffer用法详解

    本篇内容介绍了“PHP中MySQL操作的Buffer用法详解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php与mysql的连接有三种方式
    阅读数:900 php mysql
  • php 调用接口流程是什么

    php调用接口流程是:1、新建一个php文件;2、将编码格式设置为utf-8;3、通过GET方式接收调用api接口传递的参数;4、使用switch语句处理GET接收到的不同的值;5、创建函数并返回api接口调用后返回的数据。
    阅读数:162 php
  • PHP支持索引数组吗

    PHP支持索引数组;索引数组也被称为数值数组,默认情况下由索引号表示,数组的所有元素是由0开始的索引号来表示的,索引数组可以存储数字、字符串或任何对象,可以利用“$array=array("数组元素","数组元素"...);”进行定义索引数组。本文操作环境:Windows10系统、PHP8.1版、Dell G3电脑PHP支持索引数组PHP索引数组是一个数组,默认情况下由索引号表示。 数组的所有元素是
    阅读数:273 php
  • PHP如何创建索引数组

    这篇文章主要介绍了PHP如何创建索引数组,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。PHP 索引数组有两种创建索引数组的方法:索引是自动分配的(索引从 0 开始):$car
    阅读数:943 php
  • javascript与php模板引擎的实现原理

    这篇文章主要介绍“javascript与php模板引擎的实现原理”,在日常操作中,相信很多人在javascript与php模板引擎的实现原理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”javascript与
    阅读数:813 javascript php
  • php怎么实现人员信息搜索的功能

    php实现人员信息搜索的功能的方法:1、创建conn.php文件连接人员信息数据库;2、创建index.php文件;3、通过“ if(isset($_POST["flag"])){...}”等语句实现人员搜索功能即可。
    阅读数:755 PHP MySQL
  • php进行数组搜索可以吗

    php中可以进行数组搜索。php中提供了两种数组搜索函数:1、array_search(),可以在数组中搜索给定的值并返回对应的键名,语法“array_search(搜索值,数组,搜索时是否比较类型)”,返回值为字符串类型;2、array_keys(),用于在数组中搜索给定的值并返回对应的键名,语法“array_keys(数组,搜索值,是否比较类型)”,返回值为数组类型。本教程操作环境:window
    阅读数:307 php数组 php
  • PHP接入Apple对access_token/identityToken进行JWT验证流程详解

    JWT(JSONWebToken)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。本文将为大家介绍PHP如何实现JWT登录鉴权,需要的可以参考一下