eLasticsearch
的一点概述elasticsearch是一种实时分布式和开源全文搜索引擎。
可以从RESTFUL Web服务界面访问,并使用无模式JSON(JavaScript对象符号)文档存储数据。
Elasticsearch可以用作MongoDB等文档商店的替代品。
以下是与Elasticsearch关联的关键术语:
i)节点:这是Elasticsearch的单次实例。根据其资源功能,可以在单个服务器上运行多个节点。
ii)群集:顾名思义,它是一个或多个节点的集合,可在所有节点上提供集体索引和搜索功能
iii)索引:索引是不同类型文档及其属性的集合。这意味着您可以拥有包含应用程序特定部分数据的文档集合。在rdbms中,它类似于表。
iv)字段:一个字段类似于RDMS中的列。
v)文档:文档是JSON格式的字段集合。在RDBMS中,它类似于一行。每个文档都有一个名为UID的唯一标识符。
vi)碎片:索引水平细分为碎片。这意味着每个碎片包含文档的所有属性,但包含较少数量的JSON对象。它更像是整个索引的子集。它的作用像一个独立的节点,可以存储在任何节点中。主要碎片是索引的原始水平部分。
vii)复制品:Elasticsearch允许用户创建其索引和碎片的副本。复制有助于增加数据失败时数据的可用性。这也通过在这些副本中进行并行搜索操作来提高性能。
好吧!现在您已经熟悉Elasticsearch,让我们将其用于我们的简单PHP应用程序
安装和配置
我们需要设置一个Elasticsearch节点。因此,从提供here的说明中安装它。
我将在本文中使用Ubuntu。我在Vagrant上运行Ubuntu。我们可以通过apt-get安装,但是我可以下载debian软件包并运行它。
#download with a simple name
wget -c https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.8.0-amd64.deb -O elastic.deb
#run installer
sudo dpkg -i elastic.deb
Elasticsearch还需要Java运行。因此,让我们安装Java。
sudo apt-get update
sudo apt install openjdk-11-jre-headless
我们无法将Elasticsearch作为根用户运行。因此,我们需要在某些文件上授予用户所需的许可:
sudo chown -R $USER:$GROUP /etc/default/elasticsearch
sudo chown -R $USER:$GROUP /usr/share/elasticsearch/
sudo chown -R $USER:$GROUP /etc/elasticsearch
sudo chown -R $USER:$GROUP /var/lib/elasticsearch
sudo chown -R $USER:$GROUP /var/log/elasticsearch
修改其配置文件,位于/ETC/elasticsearch/elasticsearch.yml,带有以下内容
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
xpack.security.http.ssl:
enabled: false
keystore.path: certs/http.p12
xpack.security.transport.ssl:
enabled: false
为Elasticsearch配置Java路径。打开/etc/default/elasticsearch
并输入以下内容:
ES_JAVA_HOME=/usr/bin/java
启动Elasticsearch服务
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service
让我们启动Elasticsearch实例。只需运行:
/usr/share/elasticsearch/bin/elasticsearch
手动测试
我们需要一个REST客户端来在Elasticsearch上执行手册操作。 Visual Studio Code是一位受欢迎的编辑。我们将使用它。如果您已经没有它,请下载。我们将使用Visual Studio代码中可用的Thunder客户插件。因此,打开视觉工作室代码编辑器。从左侧栏中,单击扩展图标。抽屉将打开。在搜索文本字段中,输入thunder客户端,然后单击列表中的第一个项目。然后在内容区域中,单击“安装”按钮。
安装了此功能后,您会在左侧栏中找到雷霆客户端图标。点击它。它将打开一个侧面抽屉。在此点击中,“新请求”按钮。
在内容区域中,选择“ put方法”并输入«http://127.0.0.1:9200/blog的URL并按下发送按钮。
它将通过响应中验证的博客名称创建一个索引:
让S通过在此索引中添加记录进一步测试。
单击编辑器左侧的“新请求”按钮,选择“帖子方法”,然后以http://127.0.0.1:9200/blog/_doc/1。4。
输入URL。这里是我们正在手动提供的预期文档的ID。输入以下JSON内容:
{
"title": "This is a test blog post",
"body":"A dummy content for body of the post"
}
现在点击发送按钮,您应该看到这样的输出:
如果您再次发送数据,则它将增加其版本。基本上是更新操作。
让我们这样做。由于我们也需要存储标签字段。修改JSON内容如下以下并命中发送:
{
"title": "This is a test blog post",
"body":"A dummy content for body of the post",
"tags":["blog","post","test"]
}
您应该看到输出类似:
您可以看到,记录的版本从1到2更新。
插入另一个记录,而无需输入任何手动ID号。单击编辑器左侧的“新请求”按钮,选择“帖子方法”,然后以http://127.0.0.1:9200/blog/_doc。
输入URL。输入以下JSON内容:
{
"title": "What is Lorem Ipsum?",
"body":"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.",
"tags":["lorem","ipsum","capsicum"]
}
注意_id值。它自动分配。
要获取索引中的所有文档,请单击编辑器左侧的“新请求”按钮,选择“ get”方法,以http://127.0.0.1:9200/blog/_search输入URL并点击发送按钮:< /p>
让删除索引,以便我们可以重新开始。
单击编辑器左侧的新请求按钮,选择“删除方法”,输入url作为http://127.0.0.1:9200/blog,然后命中发送按钮。
现在,当您再次搜索时,您应该获得index_not_found_exception。
我们现在设置了编程执行操作。
设置客户端
首先,安装Apache Web服务器。
sudo apt update && sudo apt install apache2 && sudo apt install libapache2-mod-php
然后,将index.php作为其HTML对应物具有很高的优先级。打开/etc/apache2/mods-enabled/dir.conf
并更改:
DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
to
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
重新启动Apache服务:
sudo systemctl restart apache2
现在我们准备好编码我们的Web应用程序了。由于它将是PHP应用程序,让我们安装它。
sudo apt install php-cli unzip
我们需要一个PHP客户端才能进行Elasticsearch。为此,我们需要作曲家。作曲家是PHP软件包依赖项管理器,例如NPM nodejs。
要安装作曲家,只需运行:
curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php
sudo php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer
通过运行检查安装:
composer --version
现在转到/var/www/html并运行此命令以下载客户端:
composer require elasticsearch/elasticsearch
这将创建一个供应商目录和composer.json文件。
现在使用客户端初始化脚本创建一个附加目录
mkdir app
cd app
touch init.php
在init.php文件中粘贴以下内容
<?php
require_once 'vendor/autoload.php';
$es = new Elasticsearch\Client([
'hosts' => ['127.0.0.1:9200'],
]);
?>
以上代码初始化将在端口9200
上运行的Elasticsearch客户端网络接口的时间。
我们将创建两个屏幕,一个用于搜索,另一个用于添加数据。我们将将界面保持在最低。
所以让我们创建第一个屏幕,index.php,然后输入以下内容:
<?php
require_once "app/init.php";
if(isset($_GET['q'])){
$q = $_GET['q'];
$query = $es->search([
'body'=> [
'query' => [
'bool' => [
'should' => [
[ 'match' => [ 'title' => $q ] ],
[ 'match' => [ 'body' => $q ] ],
]
]
]
]
]);
if($query['hits']['total']["value"] >= 1){
$results = $query['hits']['hits'];
}
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Search | ElasticSearch Demo</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-9ndCyUaIbzAi2FUVXJi0CjmCapSmO7SnpJef0486qhLnuZ2cdeRhO02iuK6FUUVM" crossorigin="anonymous">
</head>
<body>
<div class="row mt-3">
<div class="mx-auto col-10 col-md-8 col-lg-6">
<!-- We are setting method as GET for form post, so we can see the enered text in url -->
<form action="<?=$_SERVER["PHP_SELF"]?>" method="GET" autocomplete="off">
<div class="row mb-3">
<div class="col">
<input type="text" class="form-control" name="q" placeholder="Enter text to Search Blog" />
</div>
</div>
<div class="row mb-3">
<div class="col">
<input type="submit" class="btn btn-primary" value="Search" />
</div>
</div>
</form>
<?php
if(isset($results)){
foreach($results as $r){
?>
<div class="row mb-3">
<div class="col">
<div class="alert alert-secondary" role="alert">
<p class="fw-bolder"><?=$r["_source"]["title"]?></p>
<?=implode(",",$r["_source"]["tags"])?>
</div>
</div>
</div>
<?php
}
}else{
echo '<div class="alert alert-danger" role="alert">
No data found
</div>';
}
?>
</div>
</div>
<!-- We are going to skip validation checks -->
</body>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-geWF76RCwLtnZ8qwWowPQNguL3RmwHVBC9FhGdlKrxdiJJigb/j/68SIy3Te4Bkz" crossorigin="anonymous"></script>
</html>
让我们分析上述代码。 HTML Doctype声明之前的PHP代码分为三个部分:
i)在此脚本中,我们需要我们之前创建的Elasticsearch客户端
ii)如果我们获得了URL参数 - 我们将在“标题”和“身体”字段上对Elasticsearch进行搜索操作查询。
iii)$ query [hits'] [总价值]将检查至少有一个记录。如果有的话,请初始化这样的结果变量:
$results = $query['hits']['hits'];
,在html表单标签关闭后,我们正在检查结果是否不是空的,然后循环循环遍历其中包含的文档,并显示标题和标签。字段值。
让我们创建用于在索引中创建文档的最终Web界面。创建一个add.php file并输入以下内容:
<?php
require_once "app/init.php";
if(!empty($_POST)){
if(isset($_POST["title"]) && isset($_POST["body"]) && isset($_POST["tags"])){
$title = $_POST["title"];
$body = $_POST["body"];
$tags = explode("," , $_POST["tags"]);
$indexed = $es->index([
"index" => "blog",
"title" => $title,
"body" => [
'title' => $title,
'body' => $body,
'tags' => $tags
]
]);
if($indexed){
echo '<div class="alert alert-success mt-3 mb-3" role="alert">
Document inserted successfully!
</div>';
}
}
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Create | ElasticSearch Demo</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-9ndCyUaIbzAi2FUVXJi0CjmCapSmO7SnpJef0486qhLnuZ2cdeRhO02iuK6FUUVM" crossorigin="anonymous">
</head>
<body>
<div class="row mt-3">
<div class="mx-auto col-10 col-md-8 col-lg-6">
<!-- We are setting method as GET for form post, so we can see the enered text in url -->
<form action="<?=$_SERVER["PHP_SELF"]?>" method="POST" autocomplete="off">
<div class="row mb-3">
<div class="col">
<input type="text" name="title" class="form-control" placeholder="Enter Title" />
</div>
</div>
<div class="row mb-3">
<div class="col">
<textarea name="body" rows="8" class="form-control" placeholder="Enter Body content"></textarea>
</div>
</div>
<div class="row mb-3">
<div class="col">
<input type="text" name="tags" class="form-control" placeholder="Enter comma separated Tags" />
</div>
</div>
<div class="row mb-3">
<div class="col">
<input type="submit" class="btn btn-primary" value="Create" />
</div>
</div>
</form>
</div>
</div>
<!-- We are going to skip validation checks -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-geWF76RCwLtnZ8qwWowPQNguL3RmwHVBC9FhGdlKrxdiJJigb/j/68SIy3Te4Bkz" crossorigin="anonymous"></script>
</body>
</html>
让我们分析上述代码。 HTML Doctype声明之前的PHP代码分为三个部分:
i)喜欢搜索页面,我们在此脚本中插入Elasticsearch客户端。
ii)如果该页面与所有表单字段提交,那么我们将在Elasticsearch中的博客索引上执行插入操作。
iii)操作的结果存储在索引变量中。如果它不是空的,那么我们将使用Bootstrap警报组件显示成功消息。
您可以返回浏览器中的搜索屏幕(index.php),然后尝试搜索某些内容。以下是字符的通用搜索结果的屏幕截图:
可以在此处找到本文的git回购。
就是这样!希望您发现这篇文章有用。
快乐的编码!
如果您发现这篇文章有帮助,请喜欢,分享并关注我。我是一个开发人员,过渡到Devops,而不是作家,因此每篇文章都是我舒适区域之外的一个很大的飞跃。
如果您需要技术作家或DevOps工程师,请在LinkedIn上与我联系:https://www.linkedin.com/in/mubin-khalife/。
感谢您的阅读和支持!