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相关推荐

  1. Elasticsearch学习之路(一)

    一.前序 1.1正向索引和倒排索引 ** 正向索引通常用于数据库中,在搜索引擎领域使用的最多的就是倒排索引 ** 通过例子表示: 我爱编程, 我爱编程,我是小码农 1.1.1 正向索引 假设我们使用m ...

  2. 2021年大数据ELK(二十五):添加Elasticsearch数据源

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 添加Elasticsearch数据源 一.Kibana索引模式 添加Elast ...

  3. 2021年大数据ELK(十九):使用FileBeat采集Kafka日志到Elasticsearch

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 使用FileBeat采集Kafka日志到Elasticsearch 一.需求分 ...

  4. 2021年大数据ELK(十七):Elasticsearch SQL 订单统计分析案例

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 订单统计分析案例 一.案例介绍 二.创建索引 三.导入测试数据 四.统计不同支 ...

  5. 2021年大数据ELK(十六):Elasticsearch SQL(职位查询案例)

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 职位查询案例 一.查询职位索引库中的一条数据 二.将SQL转换为DSL 三.职 ...

  6. 2021年大数据ELK(十五):Elasticsearch SQL简单介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch SQL简单介绍 一.SQL与Elasticsear ...

  7. 2021年大数据ELK(十三):Elasticsearch编程(添加职位数据)

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch编程 一.添加职位数据 1.初始化客户端连接 2.实 ...

  8. 2021年大数据ELK(十二):Elasticsearch编程(环境准备)

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch编程 一.环境准备 1.准备IDEA项目结构 2.准 ...

  9. 2021年大数据ELK(十一):Elasticsearch架构原理

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch架构原理 一.Elasticsearch的节点类型 ...

  10. 2021年大数据ELK(八):Elasticsearch安装IK分词器插件

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 安装IK分词器 一.下载Elasticsearch IK分词器 ...

最新文章

  1. XML文档类型定义DTD
  2. python卸载模块的方法汇总_Python卸载模块的方法汇总
  3. MySQL如何向表中增加、修改字段
  4. python实现tomasulo算法_手写算法-python代码实现KNN
  5. vim的巧用---对比操作
  6. 牛客-十二桥问题【最短路,状压dp】
  7. CE+OD无法附加游戏进程的破解方法 来吧 别在为这烦恼了
  8. 安卓学习笔记11:常用布局 - 网格布局
  9. 计算机网络————P3 速率相关的性能指标
  10. php++数据库备份,php实现数据库备份
  11. vue2.0中的watch和计算属性computed
  12. php 图片上传 文件上传 大小 限制
  13. FISCO BCOS 控制台 部署合约 调用 查看已部署合约的地址
  14. linux下svn安装与版本控制
  15. ValueError: `generator` yielded an element of shape (2,) where an element of shape (?, ?) was expect
  16. [转贴] To love and to be loved
  17. python使用RSA加密算法
  18. 基于颜色特征的图像检索(一)
  19. Python采集手机4K壁纸,又是一个练手小案例,也不用担心没壁纸换咯
  20. gensim中的word2vec使用

热门文章

  1. 极验验证码破解—超详细教程(三)
  2. qrcode生成二维码-项目记录
  3. 团体程序设计天梯赛L3-014 周游世界
  4. 益生菌产业概念股--300858科拓生物
  5. 基于数据降维的语音情感分析
  6. Python基础学习(九)---输入、输出
  7. 海外推广:常见的7个海外推广营销方式!
  8. python五大算法_一文洞悉Python必备50种算法!资深大牛至少得掌握25种!
  9. 使用 lean-cli 连接云端的 LeanDB
  10. 【风变编程】第三、四课笔记