一个可以充当数据的全文搜索引擎工具。
配置
docker部署
拉去es镜像到本地。
利用docker-compose部署
配置:
myes:
image: elasticsearch
container_name: "myes"
restart: always
expose:
- "9200"
ports:
- "9200:9200"
volumes:
- ~/server/elasticsearch/conf/elasticsearch.yml:/usr/share/elasticsearch/conf/elasticsearch.yml # 配置文件
- ~/server/elasticsearch/data:/usr/share/elasticsearch/data # 数据
- ~/server/elasticsearch/plugins:/usr/share/elasticsearch/plugins # 拓展
- ~/server/elasticsearch/logs:/usr/share/elasticsearch/logs # 日志
environment: # 配置环境变量
- TZ=Asia/Shanghai # 设置时区
- discovery.type=single-node # 单节点
# elasticsearch.yml
http.host 0.0.0.0 # 配置可访问ip,表示不限制ip
path.logs: /usr/share/elasticsearch/logs # 配置日志位置
http.max_content_length: 200mb
php镜像进行关联即可。
概念
- index:索引 可以看做一个数据库
- type:类型 可以看做库中的一张表
- id:可以看做表中某条数据的主键
基本使用
下面的使用是以Laravel Framework 7.28.1
框架进行操作。
推荐阅读
推荐阅读
推荐阅读
安装composer包
composer require "elasticsearch/elasticsearch:~6.0"
使用
安装完成后在控制器中引入
use Elasticsearch\ClientBuilder;
$client = ClientBuilder::create() // 实例化
->setHost([
// es的ip地址端口 默认9200端口
'myes' // 以docker关联的 可以直接写容器名字
])
->build(); // 构建客户端对象
索引一个文档
如果索引和文档不存在会同时创建。
同一也可以用来增加文档数据
$params = [
'index' => 'my_index', // 库
'type' => 'my_type', // 表
'id' => 'my_id', // 主键
'body' => ['field1'=>'test', 'field2'=>'value'], // 数据
];
$response = $client->index($params);
dump($response);
成功返回:
^ array:7 [▼
"_index" => "my_index"
"_type" => "my_type"
"_id" => "my_id"
"_version" => 1
"result" => "created"
"_shards" => array:3 [▼
"total" => 2
"successful" => 1
"failed" => 0
]
"created" => true
]
获取一个文档
$response = $client->get([
'index' => 'my_index',
'type' => 'my_type',
'id' => 'my_id',
'client' => ['ignore' => 404] // 忽略的相应code,未查询到文档时,返回值中的found为false
]);
dump($response);
成功返回:
^ array:6 [
"_index" => "my_index"
"_type" => "my_type"
"_id" => "my_id"
"_version" => 1
"found" => true
"_source" => array:2 [
"field1" => "test"
"field2" => "value"
]
]
根据条件查询文档
body如果是空,会返回该文档所有的数据
$searchQuery = [
"index" => 'account', // 索引
'type' => 'person', // 类型
'body' => [ // body为空会返回全部数据
'query' => [ // 查询条件
// 'match' => [ // match 查询
// 'desc' => $params['search']
// ]
// 'bool' => [ // Bool 查询
// 'must' => [
// ['match' => ['desc' => '运动']],
// ['match' => ['desc' => '篮球']],
// ]
// 'filter' => [ // 过滤器
// 'terms' => [ // terms 查询,严格匹配条件,类似于SQL中in关键字的用法
// 'title' => ['运动员','工程师']
// ]
// ],
// 'should' => [
// 'match' => ['desc' => '销售']
// ]
// ],
// 'term' => [ // term 查询 严格匹配条件,所查询的字段内容要与填入查询框搜索值一致
// 'title' => '运动员'
// ],
// 'terms' => [ // terms 查询,严格匹配条件,类似于SQL中in关键字的用法
// 'title' => ['运动员','工程师']
// ]
],
// 'size' => 10, // 控制返回数量
// 'from' => 0, // 返回数据的位置,默认从0开始
]
];
成功返回
^ array:4 [
"took" => 3
"timed_out" => false
"_shards" => array:4 [
"total" => 5
"successful" => 5
"skipped" => 0
"failed" => 0
]
"hits" => array:3 [
"total" => 1
"max_score" => 0.2876821
"hits" => array:1 [
0 => array:5 [
"_index" => "my_index"
"_type" => "my_type"
"_id" => "my_id"
"_score" => 0.2876821
"_source" => array:2 [
"field1" => "test"
"field2" => "value"
]
]
]
]
]
删除一个文档
$response = $client->delete([
'index' => 'my_index',
'type' => 'my_type',
'id' => 'my_id'
]);
dump($response);
成功返回
^ array:7 [
"found" => true
"_index" => "my_index"
"_type" => "my_type"
"_id" => "my_id"
"_version" => 2
"result" => "deleted"
"_shards" => array:3 [
"total" => 2
"successful" => 1
"failed" => 0
]
]
删除索引
$response = $client->indices()->delete(['index' => 'my_index']);
dump($response);
成功返回
^ array:1 [
"acknowledged" => true
]
创建索引
$response = $client->indices()->create(['index' => 'my_index']);
dump($response);
成功返回
^ array:3 [
"acknowledged" => true
"shards_acknowledged" => true
"index" => "my_index"
]
配置日志
官方推荐日志composer包:monolog/monolog
use Elasticsearch\ClientBuilder;
use Monolog\Logger;
$logger =new Logger("name") // name是日志前缀
$logger->pushHandler(new StreamHandler('/path/filename', Logger::INFO)); // 配置日志路径,记录日志级别
$client = ClientBuilder::create() // 实例化
->setHost([
// es的ip地址端口 默认9200端口
'myes' // 以docker关联的 可以直接写容器名字
])
->setLogger($logger) // 日志依赖入驻
->build(); // 构建客户端对象
配置中文分词
安装es拓展analysis-ik。
查看es版本,直接访问localhost:9200即可
{
"name": "name",
"cluster_name": "elasticsearch",
"cluster_uuid": "Q0yAnW8ITviAz4PiBYQtKw",
"version": {
"number": "5.6.12", // 版本号
"build_hash": "cfe3d9f",
"build_date": "2018-09-10T20:12:43.732Z",
"build_snapshot": false,
"lucene_version": "6.6.1"
},
"tagline": "You Know, for Search"
}
5.6.12版本对应的拓展也需要是5.6.12
下载zip文件后解压在配置的拓展目录中。
注意
版本不同会报如下错误:IllegalArgumentException: plugin [analysis-ik] is incompatible with version [5.6.12]; was designed for version [6.6.1]
/usr/share/elasticsearch/plugins/.DS_Store/plugin-descriptor.properties: Not a directory
上面的错误删除.DS_Store即可
增加文档和文档中的字段信息
$params = [
'index' => 'data', // 索引
'type' => 'logs', // 文档
'body' => [
'logs' => [
'properties' => [ // 文档中对应的属性
'desc' => [
'type' => 'text', // 字段类型
'analyzer' => 'ik_max_word', // 字段文本分词器
'search_analyzer' => 'ik_max_word', // 搜索信息分词器
],
],
],
],
];
$response = $client->indices()->putMapping($params);
return $response;
成功返回
{
"acknowledged": true
}
其他操作
# 验证节点是否正常
$client->ping();
- 本文链接:http://codersam.cn/2020/09/14/ElasticSearch%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。