Я использую 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();
Надеюсь, это поможет.