当创建索引的时候你可能会遇到以下错误提示
{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"The mapping definition cannot be nested under a type [_doc] unless include_type_name is set to true."}],"type":"illegal_argument_exception","reason":"The mapping definition cannot be nested under a type [_doc] unless include_type_name is set to true."},"status":400}
原因是Elasticsearch 8.x中不再支持URL中的type参数,include_type_name参数默认为false。如果需要开启,把include_type_name 设置为支持type参数即可。
在laravel中使用composer require elasticsearch/elasticsearch
扩展实例,下面贴出创建索引代码和配置如下:
<?php
// 得到es客户端对象
$client = ClientBuilder::create()->setHosts(config('es.host'))->build();
// 创建索引
$params = [
// 生成索引的名称
'index' => 'fang',
'include_type_name' => true,//Elasticsearch 8.x中不再支持URL中的type参数
// 类型 body
'body' => [
//number_of_replicas 是数据备份数,如果只有一台机器,设置为0
//number_of_shards 是数据分片数,默认为5,有时候设置为3
//可以在线改所有配置的参数,number_of_shards不可以在线改
'settings' => [
// 分区数
'number_of_shards' => 5,
// 副本数
'number_of_replicas' => 1
],
'mappings' => [
'_doc' => [
'_source' => [
'enabled' => true//获取原数据
],
// 字段 类似表字段,设置类型
'properties' => [
'fang_name' => [
// 相当于数据查询是的 = 张三你好,必须找到张三你好
'type' => 'keyword'
],
'fang_desn' => [
'type' => 'text',
// 中文分词 张三你好 张三 你好 张三你好
'analyzer' => 'ik_max_word',
'search_analyzer' => 'ik_max_word'
]
]
]
]
]
];
// 创建索引
$response = $client->indices()->create($params);
dump($response);
?>
代码语言:javascript复制array:3 [▼
"acknowledged" => true
"shards_acknowledged" => true
"index" => "fang"
]
代码语言:javascript复制//添加数据
<?php
// es数据的添加
// 得到es客户端对象
$client = ClientBuilder::create()->setHosts(config('es.host'))->build();
// 写文档
$params = [
'index' => 'fang',
'type' => '_doc',
'id' => $model->id,
'body' => [
'fang_name' => $model->fang_name,
'fang_desn' => $model->fang_desn,
],
];
// 添加数据到索引文档中
$client->index($params);