#php #amazon-web-services #elasticsearch #cakephp #elastica
Вопрос:
Итак, я запускаю CakePHP 4 на экземпляре EC2, AWS ES 7, и я настроил плагин ElasticSearch в CakePHP.
composer require cakephp/elastic-search "^3.0"
Я добавил эластичное подключение к источнику данных в config/app.php
'elastic' => [
'className' => 'CakeElasticSearchDatasourceConnection',
'driver' => 'CakeElasticSearchDatasourceConnection',
'host' => 'search-DOMAIN.REGION.es.amazonaws.com',
'port' => 443,
'transport' => "AwsAuthV4",
'aws_access_key_id' => "KEY",
'aws_secret_access_key' => "SECRET",
'aws_region' => "REGION",
'ssl' => 'true',
],
.. и я активировал плагин
use CakeElasticSearchPlugin as ElasticSearchPlugin;
class Application extends BaseApplication
{
public function bootstrap()
{
$this->addPlugin(ElasticSearchPlugin::class);
Я вручную добавил 1 запись индекса в ES через curl из экземпляра EC2. Так что я знаю, что связь между EC2 и ES работает.
curl -XPUT -u 'KEY:SECRET' 'https://search-DOMAIN.REGION.es.amazonaws.com/movies?pretty' -d '{"director": "Burton, Tim", "genre": ["Comedy","Sci-Fi"], "year": 1996, "actor": ["Jack Nicholson","Pierce Brosnan","Sarah Jessica Parker"], "title": "Mars Attacks!"}' -H 'Content-Type: application/json'
Мне также удалось найти эту запись через curl без каких-либо проблем.
В AppController.php Я попробовал этот простой поиск, просто чтобы посмотреть, работает ли плагин, и ни за что на свете я не могу заставить его работать.
# /src/Controller/AppController.php
...
use CakeElasticSearchIndexRegistry;
class AppController extends Controller
{
public function initialize(): void
{
parent::initialize();
$this->loadModel('movies', 'Elastic');
$query = $this->movies->find('all');
$results = $query->toArray();
Я получаю следующую ошибку:
Ошибка клиента: СООБЩЕНИЕ https://search-DOMAIN.REGION.es.amazonaws.com/movies/movies/_search в результате получен запрещенный ответ 403: {«сообщение»:»Маркер безопасности, включенный в запрос, недействителен».} Исключение ElasticaИсключениеСоединениеИсключение
Похоже, плагин по какой-то причине дважды добавляет имя «Индекс». Я повсюду искал обстановку, которую мог пропустить. Если я скопирую и вставлю указанный выше URL-адрес и удалю дубликат индекса из URL-адреса в браузере, он будет работать нормально.
https://search-DOMAIN.REGION.es.amazonaws.com/movies/_search
Я что-то здесь упускаю?
Я даже пробовал этот метод, и у меня та же проблема с дублированными значениями индекса в URL-адресе.
$Movies = IndexRegistry::get('movies');
$query = $Movies->find('all');
$results = $query->toArray();
Я попробовал новый/чистый экземпляр CakePHP, и у меня возникла та же проблема? Что — то не так с плагином? Есть ли лучший подход для общения с ES через CakePHP?
Ответ №1:
Я не знаком с плагином и Elasticsearch, но, насколько я понимаю, один из movies
них — это имя индекса, а один из них — имя типа, где имя типа-по крайней мере, согласно документации-должно быть единственным, т. Е. Вместо этого ожидается, что путь будет выглядеть так:
/movies/movie/_search
Кроме того, классы индексов предполагают, что сопоставление типов имеет единственное имя индекса. Например
articles
, индекс имеет сопоставление типовarticle
.
https://book.cakephp.org/elasticsearch/3/en/3-0-upgrade-guide.html#types-renamed-to-indexes
Будет ли это правильным путем в отношении того, что поддерживается используемой версией Elasticsearch, это может быть другой вопрос.
Возможно, вы захотите открыть проблему на GitHub.
Комментарии:
1. Да, я думаю, вы поняли, что этот плагин может не поддерживать ES 7.x, так как «типы индексов» устарели с ES 7.x. elastic.co/guide/en/elasticsearch/reference/current/… Я вообще не указываю структуру URL-адреса, плагин обрабатывает это.
2. @Skobbejak Путь генерируется
ruflin/elastica
AFAICT. ES 7.x пока не поддерживается, но, согласно карте версий, она будет в предстоящей версии плагина 4.x. Если вы любите приключения, попробуйтеdev-master
этот плагин.