Elasticsearch是一个基于JSON的分布式搜索和分析引擎。适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件;Elastic Stack 是一套适用于数据采集、扩充、存储、分析和可视化的免费开源工具。
用途Elasticsearch 在速度和可扩展性方面都表现出色,而且还能够索引多种类型的内容,其可用于多种用例:
应用或网站搜索
日志处理和分析
使用 Elasticsearch 作为存储引擎自动化业务工作流程
应用程序性能监测
地理空间数据分析
工作原理原始数据会从多个来源(包括日志、系统指标和网络应用程序)输入到 Elasticsearch 中。这些数据在 Elasticsearch 中索引完成之后,便可针对数据运行复杂的查询,并使用聚合来检索自身数据等复杂查询。
索引Elasticsearch 索引指相互关联的文档集合。Elasticsearch 会以 JSON 文档的形式存储数据。每个文档都会在一组键(字段或属性的名称)和它们对应的值(字符串、数字、布尔值、日期、数组、地理位置或其他类型的数据)之间建立联系。
Elasticsearch 使用的是一种名为倒排索引的数据结构,这一结构的设计可以允许十分快速地进行全文本搜索。倒排索引会列出在所有文档中出现的每个特有词汇,并且可以找到包含每个词汇的全部文档。
索引可以被认为是文档的优化集合,每个文档都是字段的集合,字段是包含数据的键值对。默认情况下,Elasticsearch 索引每个字段中的所有数据,并且每个索引字段都有一个专用的优化数据结构。例如,文本字段存储在倒排索引中,而数字和地理字段存储在 BKD 树中。使用每个字段的数据结构来组装和返回搜索结果的能力是 Elasticsearch 如此快速的原因。
Elasticsearch 还具有无模式的能力,这意味着无需明确指定每个字段及类型即可对文档进行索引。Elasticsearch 会自动检测新字段并将其添加到索引中。这种默认行为使索引和探索数据变得容易——只需开始索引文档,Elasticsearch 就会检测并将布尔值、浮点和整数值、日期和字符串映射到适当的 Elasticsearch 数据类型。
安装和配置 安装1.此处基于Docker安装,没有Docker,请先安装Docker。
2.执行以下命令(安装版本为8.1)
docker network create elastic docker pull docker.elastic.co/elasticsearch/elasticsearch:8.1.0 docker run --name es-node01 --net elastic -p 9200:9200 -p 9300:9300 -it docker.elastic.co/elasticsearch/elasticsearch:8.1.0
首次启动 Elasticsearch 时,会自动进行以下安全配置:
为传输层和 HTTP 层生成证书和密钥。
传输层安全 (TLS) 配置设置写入 elasticsearch.yml。
为elastic用户生成密码。
为 Kibana 生成一个注册令牌。
3.复制生成的密码和注册令牌并将其保存在安全位置。这些值仅在第一次启动 Elasticsearch 时显示。
Elasticsearch-php 安装和使用 安装composer.json 中添加以下片段
{
"require": {
"elasticsearch/elasticsearch": "~7.0"
}
}
安装php composer.phar install
连接 HTTP 认证如果采用了HTTP认证,需要按如下格式
$hosts = [
'http://user:pass@localhost:9200',
];
$client = ClientBuilder::create() ->setHosts($hosts)
->build();
如果 Elasticsearch 集群由API 密钥保护,如以下代码片段所示。
$client = ClientBuilder::create() ->setApiKey('id', 'api_key')
->build();
SSL配置
配置 SSL 稍微复杂一些。需要确定您的证书是否已由公共证书颁发机构 (CA) 签名,或者它是否是自签名证书。
公共 CA 证书
$hosts = [
'https://localhost:9200'
];
$client = ClientBuilder::create()
->setHosts($hosts)
->build();
自签名证书
$hosts = ['https://localhost:9200'];
$myCert = 'path/to/cacert.pem';
$client = ClientBuilder::create()
->setHosts($hosts)
->setSSLVerification($myCert)
->build();
使用
索引一个文档
相当于新增一个数据库。json数据通过body参数传入。id可以指定也可以不指定,不指定就是自动生成。id唯一标识一个文档。
$params = [
'index' => 'my_index',
'id' => 'my_id',
'body' => ['testField' => 'abc']
];
$response = $client->index($params);
print_r($response);
获取一个文档
index,id需指定
$params = [
'index' => 'my_index',
'id' => 'my_id'
];
$response = $client->get($params);
print_r($response);
删除一个文档
$params = [
'index' => 'my_index',
'id' => 'my_id'
];
$response = $client->delete($params);
print_r($response);
删除索引
$deleteParams = [
'index' => 'my_index'
];
$response = $client->indices()->delete($deleteParams); print_r($response);
创建索引
// 简单创建
$client = ClientBuilder::create()->build();
$params = [
'index' => 'my_index'
];
$response = $client->indices()->create($params);
// 连同设置,字段类型一起创建(也可不指定,ES会自动匹配类型)
$client = ClientBuilder::create()->build();
$params = [
'index' => 'my_index',
'body' => [
'settings' => [
'number_of_shards' => 3, //分片数
'number_of_replicas' => 2 //副本数
],
// 定义字段类型
'mappings' => [
'_source' => [
'enabled' => true
],
'properties' => [
'first_name' => [
'type' => 'keyword'
],
'age' => [
'type' => 'integer'
]
]
]
]
];
$response = $client->indices()->create($params);



