我正在使用laravel和elasticsearch-php来索引和存储数据到弹性,我的问题是elastisearch使用动态映射,但我需要设置我的自定义映射。如何使用我的映射?
波纹管是我的代码:
$client = 'Elasticsearch'ClientBuilder::create()->build();
$mappingData = array(
'index' => 'promote_kmp',
'body' => array(
'mappings' => $resource->getMappingProperties()
)
);
$client->indices()->create($mappingData);
$params = [
'type' => 'resources',
'id' => uniqid(),
'body' => [
'id' => $resource->id,
'name' => $resource->name,
'display_name_en' => $resource->display_name_en,
'display_name_pr' => $resource->display_name_pr,
'display_name_pa' => $resource->display_name_pa,
'table_name' => $resource->table_name,
'model_name' => $resource->model_name,
'in_sidemenu' => $resource->in_sidemenu,
'icon_class' => $resource->icon_class,
'created_at' => $resource->created_at,
'created_by' => $user,
]
];
//$response = $client->indices()->create($resource->getMappingProperties());
$client->index($params);
$resource->getMappingProperties()
获取我在模型中设置的映射数组。但是当我想索引一条记录时,它说IndexAlreadyExistsException[[promote_kmp] already exists]
.当我想搜索日期字段搜索无法正常工作并且我想映射不正确时,会出现此问题。
正如我在评论中所说。
每次要查询时,代码都会执行索引的创建。但索引只能创建一次。
因此,它应该像数据库的迁移一样工作。
我能给你的唯一想法是发出一个命令来生成索引。这样你就可以
$ artisan elasticsearch:generate <index>
关于代码,我为我们的案例所做的是,使用注入类型的方法制作索引,以及将它们创建到 elasticsearch 中的方法:
interface Index {
/**
* @param Type[] $types Index types (resources)
*/
function setTypes(array $types);
/**
* Generate the index and the types into the elasticsearch
*/
function create();
}
然后类型应该生成映射和类型名称(如/<index>/<type>
,例如:
interface Type {
/**
* @return string The type name
*/
function getName();
/**
* @return array The type mapping
*/
function getMapping();
}
所以(在某个地方),你会创建类(这可能更好):
$myIndex = new MyIndex();
$myIndex->setTypes([
new MyFirstType(),
new MySecondType(),
//...
]);
$myIndex->create();
我希望这有所帮助。