返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP中使用ElasticSearch最新实例讲解
  • 161
分享到

PHP中使用ElasticSearch最新实例讲解

2024-04-02 19:04:59 161人浏览 独家记忆
摘要

网上很多关于ES的例子都过时了,版本很老,这篇文章的测试环境是es6.5 通过composer安装 composer require 'elasticsearch/elastic

网上很多关于ES的例子都过时了,版本很老,这篇文章的测试环境是es6.5

通过composer安装


composer require 'elasticsearch/elasticsearch'

在代码中引入


require 'vendor/autoload.PHP';

use Elasticsearch\ClientBuilder;

$client = ClientBuilder::create()->setHosts(['172.16.55.53'])->build();

下面循序渐进完成一个简单的添加和搜索的功能。

首先要新建一个index:

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


$params = [
  'index' => 'myindex', #index的名字不能是大写和下划线开头
  'body' => [
    'settings' => [
      'number_of_shards' => 2,
      'number_of_replicas' => 0
    ]
  ]
];
$client->indices()->create($params);

在Mysql里面,光有了数据库还不行,还需要建立表,ES也是一样的,ES中的type对应MySQL里面的表。

注意:ES6以前,一个index有多个type,就像MySQL中一个数据库有多个表一样自然,但是ES6以后,每个index只允许一个type,在往以后的版本中很可能会取消type。

type不是单独定义的,而是和字段一起定义


$params = [
  'index' => 'myindex',
  'type' => 'mytype',
  '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'
        ]
      ]
    ]
  ]
];
$client->indices()->putMapping($params);

在定义字段的时候,可以看出每个字段可以定义单独的类型,在first_name中还自定义了分词器 ik,

这个分词器是一个插件,需要单独安装的,参考另一篇文章:ElasticSearch基本尝试

现在数据库和表都有了,可以往里面插入数据了

概念:这里的 数据 在ES中叫文档


$params = [
  'index' => 'myindex',
  'type' => 'mytype',
  //'id' => 1, #可以手动指定id,也可以不指定随机生成
  'body' => [
    'first_name' => '张',
    'last_name' => '三',
    'age' => 35
  ]
];
$client->index($params);

多插入一点数据,然后来看看怎么把数据取出来:

通过id取出单条数据:

插曲:如果你之前添加文档的时候没有传入id,ES会随机生成一个id,这个时候怎么通过id查?id是多少都不知道啊。

所以这个插入一个简单的搜索,最简单的,一个搜索条件都不要,返回所有index下所有文档:


$data = $client->search();

现在可以去找一找id了,不过你会发现id可能长这样:zU65WWgBVD80YaV8iVMk,不要惊讶,这是ES随机生成的。

现在可以通过id查找指定文档了:


$params = [
  'index' => 'myindex',
  'type' => 'mytype',
  'id' =>'zU65WWgBVD80YaV8iVMk'
];
$data = $client->get($params);

最后一个稍微麻烦点的功能:

注意:这个例子我不打算在此详细解释,看不懂没关系,这篇文章主要的目的是基本用法,并没有涉及到ES的精髓地方,

ES精髓的地方就在于搜索,后面的文章我会继续深入分析


$query = [
  'query' => [
    'bool' => [
      'must' => [
        'match' => [
          'first_name' => '张',
        ]
      ],
      'filter' => [
        'range' => [
          'age' => ['gt' => 76]
        ]
      ]
    ]

  ]
];
$params = [
  'index' => 'myindex',
// 'index' => 'm*', #index 和 type 是可以模糊匹配的,甚至这两个参数都是可选的
  'type' => 'mytype',
  '_source' => ['first_name','age'], // 请求指定的字段
  'body' => array_merge([
    'from' => 0,
    'size' => 5
  ],$query)
];
$data = $this->EsClient->search($params);

上面的是一个简单的使用流程,但是不够完整,只讲了添加文档,没有说怎么删除文档,

下面我贴出完整的测试代码,基于Laravel环境,当然环境只影响运行,不影响理解,包含基本的常用操作:    


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

class EsDemo {
	private $EsClient = null;
	private $faker = null;
	
	private $index = 'megacorp';
	private $type = 'employee';
	public function __construct(Faker $faker) {
		
		$this->EsClient = ClientBuilder::create()->setHosts(['172.16.55.53'])->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://lsjlt.com/news/121941.html(转载时请注明来源链接)

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

猜你喜欢
  • PHP中使用ElasticSearch最新实例讲解
    网上很多关于ES的例子都过时了,版本很老,这篇文章的测试环境是ES6.5 通过composer安装 composer require 'elasticsearch/elastic...
    99+
    2024-04-02
  • Java使用elasticsearch基础API使用案例讲解
    1.依赖 我用的是 springboot 2.2.5.RELEASE 版本,这里只贴出主要依赖: <dependency> <groupId>o...
    99+
    2024-04-02
  • Android中SharedPreference使用实例讲解
    SharedPreference方面的内容还算是比较简单易懂的,在此还是主要贴上效果与代码,最后也是附上源码。 首先是输入账号admin,密码123,选择记住密码登陆。 登陆后...
    99+
    2022-06-06
    Android
  • PHP ignore_user_abort()实例讲解
    ignore_user_abort()函数用于设置脚本在客户端断开连接后是否继续执行。当客户端断开连接时,通常情况下脚本会立即终止执...
    99+
    2023-09-28
    PHP
  • 实例讲解Android中SQLiteDatabase使用方法
    SQLite数据库是android系统内嵌的数据库,小巧强大,能够满足大多数SQL语句的处理工作,而SQLite数据库仅仅是个文件而已。虽然SQLite的有点很多,但并不是如同...
    99+
    2022-06-06
    方法 Android
  • PHP include_once()、require_once()实例讲解
    include_once()和require_once()是两个PHP函数,它们的作用是在当前脚本中包含并执行另一个文件,并且只包含...
    99+
    2023-09-28
    PHP
  • vue-router的导航守卫使用最新讲解
    目录前言vue-router中编程式导航API导航守卫全局守卫独享路由守卫组件路由守卫前言 在浏览器中点击链接实现导航的方式,叫做声明式导航。例如:普通网页中点击<a>链...
    99+
    2022-12-16
    vue-router导航守卫 vue-router导航守卫使用
  • PHP中如何使用Elasticsearch
    这篇文章将为大家详细讲解有关PHP中如何使用Elasticsearch,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP中使用Elasticsearchcomposer require&nbs...
    99+
    2023-06-06
  • 实例讲解如何用PHP来实现最简单的密码设置
    在互联网发展的今天,网站的安全性问题越来越重要。针对网站的安全问题,我们需要掌握一些技巧和知识。其中,设置密码是最基本、最常见的一种安全措施,本文将讲解如何使用 PHP 来实现最简单的密码设置。创建一个表单首先,我们需要创建一个表单,用于接...
    99+
    2023-05-14
  • Java实例讲解Comparator的使用
    目录前言关于Comparator原题前言 今天刷个题,遇到一个很有趣的问题,关于Comparator的使用,感觉也是一个关于写代码的一些小细节的问题 关于Comparator Com...
    99+
    2022-11-13
    Java Comparator方法 Java Comparator接口
  • C++实例讲解引用的使用
    目录1.什么是引用2.引用的用法2.1 普通引用2.2 const 引用2.3 作用在函数参数2.4 作用在函数返回值3.引用的本质1.什么是引用 引用可以看作是一个已经定义的变量的...
    99+
    2024-04-02
  • Elasticsearch 如何在 PHP 中使用
    引言:Elasticsearch是一个开源的分布式搜索引擎,它能够实现快速、准确地搜索和分析大量数据。它提供了简单且强大的API,使得开发者可以轻松地在各种编程语言中使用Elasticsearch。这篇文章将向你介绍如何在PHP中使用Ela...
    99+
    2023-10-21
    使用 PHP elasticsearch
  • Elasticsearch 计数分词中的token使用实例
    目录正文使用命令写入文档搜索 token 文档正文 在我们针对 text 类型的字段进行分词时,分词器会把该字段分解为一个个的 token。如果你对分词器还不是很理解的话,请参考我...
    99+
    2023-01-31
    Elasticsearch计数分词token Elasticsearch token
  • JS中URL.createObjectURL使用示例讲解
    目录前言URL.createObjectURL()语法参数返回值示例URL.revokeObjectURL()语法参数objectURLReturnvalue示例与FileReade...
    99+
    2024-04-02
  • SpringBoot项目依赖和配置最新示例讲解
    目录maven依赖及一些配置SpringSpring项目的依赖SpringBoot项目数据库相关mysql - connector依赖druid连接池–集成boot项目c...
    99+
    2022-11-13
    SpringBoot项目依赖 SpringBoot项目配置
  • 如何在PHP中使用ElasticSearch实现搜索
    这篇“如何在PHP中使用ElasticSearch实现搜索”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何在PHP中使用E...
    99+
    2023-06-05
  • Elasticsearch索引的分片分配Recovery使用讲解
    目录什么是recovery?减少集群full restart造成的数据来回拷贝减少主副本之间的数据复制特大热索引为何恢复慢什么是recovery? 在elasticsearch中,r...
    99+
    2024-04-02
  • Android App在ViewPager中使用Fragment的实例讲解
    据说Android最推荐的是在ViewPager中使用FragMent,即ViewPager中的页面不像前面那样用LayoutInflater直接从布局文件加载,而是一个个Fr...
    99+
    2022-06-06
    viewpager fragment app Android
  • 实例讲解golang中regex库的使用方法
    随着大数据时代的到来,对数据处理能力的要求越来越高。因此,对于程序开发者来说,灵活、高效的数据处理能力显得尤为重要。在这方面,golang的regex库能够满足程序开发者的需求。golang的regex库提供了一些用于匹配和替换模式的函数,...
    99+
    2023-05-14
  • python中waitKey实例用法讲解
    1、说明 用于等待按钮。当用户按下按钮时,句子将被执行并获得返回值。 2、语法 retval=cv2.waitKey([delay]) Retval:表示返回值; ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作