【发布时间】:2021-09-07 10:46:17
【问题描述】:
所以我在 EC2 实例 AWS ES 7 上运行 CakePHP 4,并在 CakePHP 中设置了 ElasticSearch 插件。
composer require cakephp/elastic-search "^3.0"
我在 config/app.php 中添加了弹性数据源连接
'elastic' => [
'className' => 'Cake\ElasticSearch\Datasource\Connection',
'driver' => 'Cake\ElasticSearch\Datasource\Connection',
'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 Cake\ElasticSearch\Plugin as ElasticSearchPlugin;
class Application extends BaseApplication
{
public function bootstrap()
{
$this->addPlugin(ElasticSearchPlugin::class);
我已经通过 curl 从 EC2 实例手动向 ES 添加了 1 条索引记录。所以我知道 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 Cake\ElasticSearch\IndexRegistry;
class AppController extends Controller
{
public function initialize(): void
{
parent::initialize();
$this->loadModel('movies', 'Elastic');
$query = $this->movies->find('all');
$results = $query->toArray();
我收到以下错误:
客户端错误:POST https://search-DOMAIN.REGION.es.amazonaws.com/movies/movies/_search 导致 403 Forbidden 响应:{“消息”:“安全令牌 请求中包含的内容无效。"} Elastica\Exception\Connection\GuzzleException
似乎插件出于某种原因两次添加了“索引”名称。我到处寻找我可能错过的环境。如果我复制并粘贴上面的 URL 并在浏览器中从 URL 中删除重复的索引,它就可以正常工作。
https://search-DOMAIN.REGION.es.amazonaws.com/movies/_search
我错过了什么吗?
我什至尝试过这种方法,但在 url 中重复索引值时遇到了同样的问题。
$Movies = IndexRegistry::get('movies');
$query = $Movies->find('all');
$results = $query->toArray();
我尝试了一个新的/干净的 CakePHP 实例,但我遇到了同样的问题?插件有问题吗?有没有更好的方法通过 CakePHP 与 ES 通信?
【问题讨论】:
标签: php amazon-web-services elasticsearch cakephp elastica