Elasticsearch和PHP
Elasticsearch是您可能要在下一个项目中使用的最先进的全文搜索引擎。它基于类似NoSQL的文档存储,并针对惊人的快速搜索查询进行了优化。强大的API启用了以下功能:模糊匹配(在搜索“ Torronto”时查找“ Toronto”),词干(在“ racing”中查找“ race”)和n-gram(在“ ghett”中查找“ spaghetti”)。
在本文中,我将向您展示如何使用PHP设置Elasticsearch实例以及如何轻松执行查询。
因此您可以通过将请求发送到来与容器的REST API通信localhost:9200,例如:
curl -XGET http://127.0.0.1:9200/_cat/health
如果到目前为止一切正常,此命令应返回以下输出:
1536999057 08:10:57 docker-cluster green 1 1 0 0 0 0 0 0 - 100.0%
新增文档
在我们设置一个简单的PHP应用程序以与Elasticsearch通信之前,我将向您展示如何直接通过HTTP使用REST API添加文档。
curl -H "Content-Type: application/json" -XPOST "http://127.0.0.1:9200/firstindex/user" -d "{ \"firstname\" : \"Donald\", \"lastname\" : \"Trump\"}"
我们使用该curl命令将POST请求发送到Elasticsearch服务器。/firstindex指定我们要将文档添加到该特定索引(您可以将其视为数据库)–如果尚不存在,则会自动创建该文档。此外,我们将文档添加到类型中user(对应于关系数据库中的表)。该文档本身以JSON格式传递,由两个字段(firstname和lastname)及其各自的值组成。
为了演示搜索功能,让我们再添加两个用户:
curl -H "Content-Type: application/json" -XPOST "http://127.0.0.1:9200/firstindex/user" -d "{ \"firstname\" : \"Barack\", \"lastname\" : \"Obama\"}"
curl -H "Content-Type: application/json" -XPOST "http://127.0.0.1:9200/firstindex/user" -d "{ \"firstname\" : \"Melania\", \"lastname\" : \"Trump\"}"
搜寻文档
在创建更复杂的查询之前,让我们首先验证输入的数据是否已保存:
curl -XGET "http://127.0.0.1:9200/firstindex/user/_search/?pretty=true"
这将在索引firstindex中查询类型为user的所有文档。输出(根据参数?pretty = true的请求)应正确设置格式,并等效于以下内容:
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 3,
"max_score" : 1.0,
"hits" : [
{
"_index" : "firstindex",
"_type" : "user",
"_id" : "F1ZQ3GUBPff1ZX4kkcru",
"_score" : 1.0,
"_source" : {
"firstname" : "Barack",
"lastname" : "Obama"
}
},
{
"_index" : "firstindex",
"_type" : "user",
"_id" : "GFZQ3GUBPff1ZX4kqMrp",
"_score" : 1.0,
"_source" : {
"firstname" : "Melania",
"lastname" : "Trump"
}
},
{
"_index" : "firstindex",
"_type" : "user",
"_id" : "FlZM3GUBPff1ZX4kLcq5",
"_score" : 1.0,
"_source" : {
"firstname" : "Donald",
"lastname" : "Trump"
}
}
]
}
}
如您所见,所有三个用户均已成功获取。Elasticsearch还输出有关查询花费了多长时间(以毫秒为单位),产生了多少结果以及对于每个检索到的文档的索引,类型和标识符的附加信息。
现在,您可以index.php在喜欢的文本编辑器中打开文档,并将其更改为以下内容:
<h1>Search Results</h1>
<ul>
<li>First Result</li>
<li>Second Result</li>
</ul>
重新加载浏览器时,PHPInfo应该消失了,并且简单的前端模板也应该可见。
设置Elasticsearch-PHP
我们可以curl像在第一部分中那样与Elasticsearch服务器通信。但是,使用elasticsearchPHP软件包要方便得多。我们将使用composer安装它。
apt-get update ; apt-get install -y wget git ; wget https://getcomposer.org/composer.phar
php composer.phar require elasticsearch/elasticsearch
composer完成魔术之后,elasticsearch软件包(及其所有依赖项)已下载到该vendor/文档夹中。
现在,我们可以将index.php文档更改为以下内容(说明如下):
<?php
require 'vendor/autoload.php';
use Elasticsearch\ClientBuilder;
$hosts = [
'elasticsearch:9200', // IP + Port
];
$client = ClientBuilder::create()
->setHosts($hosts)
->build();
$params = [
'index' => 'firstindex',
'type' => 'user',
'body' => [
'query' => [
'match' => [
'lastname' => 'Trump'
]
]
]
];
$response = $client->search($params);
echo '<pre>', print_r($response, true), '</pre>';
?>
<h1>Search Results</h1>
<ul>
<li>First Result</li>
<li>Second Result</li>
</ul>
让我们快速地逐行浏览。
require 'vendor/autoload.php';
我们导入Composer的自动加载器,因此不必担心分别包含每个类文档。
use Elasticsearch\ClientBuilder;
导入名称空间,以便我们可以使用ClientBuilder该类而无需明确提及其名称空间。
$hosts = [
'elasticsearch:9200', // IP + Port
];
这配置了我们的Elasticsearch服务器可访问的位置。由于我们已将两个容器配置为位于同一个Docker网络中,因此我们可以直接引用该容器的名称,然后Docker自动将其解析为其IP。
$client = ClientBuilder::create()
->setHosts($hosts)
->build();
这将实例化一个ClientBuilder用作Elasticsearch服务器接口的对象。
$params = [
'index' => 'firstindex',
'type' => 'user',
'body' => [
'query' => [
'match' => [
'lastname' => 'Trump'
]
]
]
];
在这里,我们指定搜索参数。对于我们的示例,我们希望从indexfirstindex类型的index接收所有文档user,其中文档值lastname等于Trump(直接匹配)。
$response = $client->search($params);
echo '<pre>', print_r($response, true), '</pre>';
我们执行查询(注意,实际上它不是在运行PHP应用程序的容器中执行,而是发送到另一个运行Elasticsearch的容器中)并输出结果。该<pre>标签确保我们的输出易读。
index.php再次在浏览器中打开时,我们将看到以下输出:
Array
(
[took] => 9
[timed_out] =>
[_shards] => Array
(
[total] => 5
[successful] => 5
[skipped] => 0
[failed] => 0
)
[hits] => Array
(
[total] => 2
[max_score] => 0.6931472
[hits] => Array
(
[0] => Array
(
[_index] => firstindex
[_type] => user
[_id] => bo573GUB5GzvNJfl38JF
[_score] => 0.6931472
[_source] => Array
(
[firstname] => Donald
[lastname] => Trump
)
)
[1] => Array
(
[_index] => firstindex
[_type] => user
[_id] => cY583GUB5GzvNJflIMI-
[_score] => 0.2876821
[_source] => Array
(
[firstname] => Melania
[lastname] => Trump
)
)
)
)
)
您可以看到该查询产生了两个结果。
创建比赛清单
总结本文,我们将在HTML模板中将匹配项输出为名字和姓氏列表。
首先,index.php由于我们仅将此行用作概念验证,因此我们将其删除:
echo '<pre>', print_r($response, true), '</pre>';
接下来,我们将从Elasticsearch输出创建结果数组:
$resultNames = array_map(function($item) {
return $item['_source'];
}, $response['hits']['hits']);
我们array_map用来将输出数组转换成一个[firstname, lastname]元组列表。
最后,我们修改HTML模板:
<h1>Search Results</h1>
<ul>
<?php foreach($resultNames as $resultName): ?>
<li><?php echo implode(' ', $resultName); ?></li>
<?php endforeach; ?>
</ul>
对于每个搜索结果,我们输出名字和姓氏,以空格分隔。该<li>标签创建一个无序列表。我们的代码应生成以下结果:
Elasticsearch和PHP相关推荐
- Elasticsearch学习之路(一)
一.前序 1.1正向索引和倒排索引 ** 正向索引通常用于数据库中,在搜索引擎领域使用的最多的就是倒排索引 ** 通过例子表示: 我爱编程, 我爱编程,我是小码农 1.1.1 正向索引 假设我们使用m ...
- 2021年大数据ELK(二十五):添加Elasticsearch数据源
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 添加Elasticsearch数据源 一.Kibana索引模式 添加Elast ...
- 2021年大数据ELK(十九):使用FileBeat采集Kafka日志到Elasticsearch
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 使用FileBeat采集Kafka日志到Elasticsearch 一.需求分 ...
- 2021年大数据ELK(十七):Elasticsearch SQL 订单统计分析案例
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 订单统计分析案例 一.案例介绍 二.创建索引 三.导入测试数据 四.统计不同支 ...
- 2021年大数据ELK(十六):Elasticsearch SQL(职位查询案例)
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 职位查询案例 一.查询职位索引库中的一条数据 二.将SQL转换为DSL 三.职 ...
- 2021年大数据ELK(十五):Elasticsearch SQL简单介绍
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch SQL简单介绍 一.SQL与Elasticsear ...
- 2021年大数据ELK(十三):Elasticsearch编程(添加职位数据)
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch编程 一.添加职位数据 1.初始化客户端连接 2.实 ...
- 2021年大数据ELK(十二):Elasticsearch编程(环境准备)
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch编程 一.环境准备 1.准备IDEA项目结构 2.准 ...
- 2021年大数据ELK(十一):Elasticsearch架构原理
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch架构原理 一.Elasticsearch的节点类型 ...
- 2021年大数据ELK(八):Elasticsearch安装IK分词器插件
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 安装IK分词器 一.下载Elasticsearch IK分词器 ...
最新文章
- XML文档类型定义DTD
- python卸载模块的方法汇总_Python卸载模块的方法汇总
- MySQL如何向表中增加、修改字段
- python实现tomasulo算法_手写算法-python代码实现KNN
- vim的巧用---对比操作
- 牛客-十二桥问题【最短路,状压dp】
- CE+OD无法附加游戏进程的破解方法 来吧 别在为这烦恼了
- 安卓学习笔记11:常用布局 - 网格布局
- 计算机网络————P3 速率相关的性能指标
- php++数据库备份,php实现数据库备份
- vue2.0中的watch和计算属性computed
- php 图片上传 文件上传 大小 限制
- FISCO BCOS 控制台 部署合约 调用 查看已部署合约的地址
- linux下svn安装与版本控制
- ValueError: `generator` yielded an element of shape (2,) where an element of shape (?, ?) was expect
- [转贴] To love and to be loved
- python使用RSA加密算法
- 基于颜色特征的图像检索(一)
- Python采集手机4K壁纸,又是一个练手小案例,也不用担心没壁纸换咯
- gensim中的word2vec使用