PHP Elastic搜索如何在索引记录之前设置映射


PHP ElasticSearch how to set mapping before indexing records?

我正在使用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();

我希望这有所帮助。