PHP ElasticSearch, как настроить отображение перед индексацией записей?

Я использую laravel и elasticsearchphp для индексации и хранения данных до эластичных, моя проблема заключается в том, что 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(); 

    Надеюсь, это поможет.