Я экспериментирую с ElasticSearch, используя laravel. Вот моя конфигурация на данный момент: -
конфиг/эластик.php
return array(
'config' => [
'hosts' => ['localhost:9200'],
'retries' => 1,
],
'default_index' => 'contents',
);
приложение/Content.php
class Content extends Model
{
use ElasticquentTrait;
protected $fillable = ['title', 'text', 'image'];
protected $mappingProperties = array(
'title' => [
'type' => 'string',
"analyzer" => "standard",
],
'text' => [
'type' => 'text',
"analyzer" => "standard",
],
'image' => [
'type' => 'string',
"analyzer" => "standard",
],
);
}
маршруты/web.php
Route::get('/', function () {
App\Content::createIndex($shards = null, $replicas = null);
App\Content::putMapping($ignoreConflicts = true);
App\Content::addAllToIndex();
return view('contents.index', [
'contents' => App\Content::all(),
]);
});
Route::get('/search', function() {
return App\Content::searchByQuery(['match' => ['title' => 'Adipisci']]);
});
композитор.json
"require": {
"elasticquent/elasticquent": "dev-master",
}
// database/migrations/2020_12_12_105155_create_contents_table.php
public function up()
{
Schema::create('contents', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('title');
$table->text('text');
$table->string('image');
$table->timestamps();
});
}
Мое приложение работает в док-контейнере по адресу: http://localhost:3024
Мой эластичный поиск также работает в док-контейнере по адресу:
docker run --rm -d -e "discovery.type=single-node" -e "bootstrap.memory_lock=true" -p 9200:9200 elasticsearch:6.8.1
и я могу получить к нему доступ с помощью cURL (и в браузере): -
curl -X GET 'http://localhost:9200'
{
"name" : "irt6ohl",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "jtqcAMyJTRunrxobr6zE_g",
"version" : {
"number" : "6.8.1",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "1fad4e1",
"build_date" : "2019-06-18T13:16:52.517138Z",
"build_snapshot" : false,
"lucene_version" : "7.7.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
Моя база данных работает, перенесена и заполнена нормально. Кажется, эти три строки в routes/web.php
нарушают код: -
App\Content::createIndex($shards = null, $replicas = null);
App\Content::putMapping($ignoreConflicts = true);
App\Content::addAllToIndex();
Эти настройки являются основополагающими для настройки ElasticSearch
?
Я гуглил, и у других людей были похожие проблемы, но я не смог найти окончательного решения. Вы можете пролить свет на это?
Проблема в том, что каждый докер почти как изолированная среда.
Итак, ваше приложение (работающее на http://localhost:3024) пытается подключиться к localhost:9200 в том же контейнере. и, таким образом, это приводит к ошибке, которую вы получаете.
Чтобы это исправить, вам нужно соединить оба контейнера через сеть.
Прочтите это: Docker Network Connect
Вообще говоря, лучше, если вы разделите свои службы (1 служба на контейнер), в этом весь смысл контейнеров. Однако, если вы запускаете службы в одном и том же контейнере, вы не можете просто подключить их без сети. Если вы получаете эту ошибку, убедитесь, что ваши экземпляры elasticsearch запущены и работают, и что вы подключаетесь с правильным ip/ порт
У меня каждая служба (selenium, elasticsearch) работает в одном контейнере. Нужно ли их подключать? . Я получаю сообщение об ошибке «В вашем кластере не найдено активных узлов».