Мне нужно обновить отображение с помощью дополнительных полей, но я решил сначала создать экспериментальное отображение и записать в него документы, чтобы устранить проблемы.
Здесь оригинал:
"index": "bookmark",
"type": "bookmark"
... и эксперимент такой:
"index": "experiment",
"type": "experiment"
Как оказалось, все это сработало в первый раз, но затем следующий документ не сработал, а записал в индекс "закладки".
Я потратил несколько часов, изменяя имена индексов и типов, и хотя он иногда записывает в индекс «эксперимент» один или несколько раз, он затем переключается на «закладку», не возвращаясь.
В приложении есть две ссылки на индекс и тип, и обе они передаются в виде массива в класс, который обрабатывает работу Elastic.
Если удалить массив «data» для документа, который будет передан в Elastic, он не будет записывать данные, что, как я полагаю, должно быть очевидным, но тогда при нормальных обстоятельствах он игнорирует объект "meta_information", индекс и тип.
Стоит отметить, что это зрелое приложение, которое использует Elastic без ошибок с 5.6.
Такое поведение необъяснимо и, согласно коду, тоже невозможно.
С точки зрения различий между двумя отображениями, эксперимент: имеет дополнительный «вложенный» объект; и другой "тип".
Я использую Elastic 6.2.4 и Kibana той же версии.
В соответствии с запросом приведено сопоставление индекса «эксперимента»:
PUT localhost:9200/experiment
{
"settings":{
"analysis":{
"char_filter":{
"&_to_and":{
"type": "mapping",
"mappings": ["&=> and "]
}
},
"filter":{
"asset_en_stopwords":{
"type": "stop",
"stopwords": ["_english_"]
},
"asset_en_stemmer":{
"type": "stemmer",
"name": "english"
},
"asset_en_shingle":{
"type": "shingle",
"max_shingle_size": 5,
"min_shingle_size": 2,
"output_unigrams": false,
"output_unigrams_if_no_shingles": true
}
},
"analyzer":{
"asset_en_analyzer":{
"type": "custom",
"char_filter": ["html_strip", "&_to_and"],
"tokenizer": "standard",
"filter": ["asset_en_stopwords", "asset_en_stemmer", "lowercase", "asset_en_shingle", "asciifolding"]
}
}
}
},
"mappings":{
"experiment":{
"properties":{
"user_id":{
"type": "long"
},
"creation":{
"type": "date",
"format": "date_hour_minute_second"
},
"deleted":{
"type": "integer"
},
"favourite":{
"type": "integer"
},
"modification":{
"type": "date",
"format": "date_hour_minute_second"
},
"note":{
"type": "text",
"analyzer": "english",
"fields":{
"std":{
"type": "text",
"analyzer": "asset_en_analyzer",
"fields":{
"std":{
"type": "text",
"analyzer": "standard"
}
}
}
}
},
"title":{
"type": "text",
"analyzer": "english",
"fields":{
"std":{
"type": "text",
"analyzer": "asset_en_analyzer",
"fields":{
"std":{
"type": "text",
"analyzer": "standard"
}
}
}
}
},
"links_to_asset":{
"type": "nested",
"properties":{
"note_link_id":{
"type": "long"
},
"user_id":{
"type": "long"
},
"creation":{
"type": "date",
"format": "date_hour_minute_second"
},
"modification":{
"type": "date",
"format": "date_hour_minute_second"
},
"to_asset":{
"type": "integer"
},
"from_asset":{
"type": "integer"
},
"comment":{
"type": "text",
"fields":{
"std":{
"type": "text",
"analyzer": "asset_en_analyzer",
"fields":{
"std":{
"type": "text",
"analyzer": "standard"
}
}
}
}
}
}
},
"meta_information":{
"type": "nested",
"properties":{
"entities":{
"type": "nested",
"properties":{
"name":{
"type": "text",
"fields":{
"std":{
"type": "text",
"analyzer": "asset_en_analyzer",
"fields":{
"std":{
"type": "text",
"analyzer": "standard"
}
}
}
}
},
"type":{
"type":"keyword"
},
"salience":{
"type":"integer"
},
"metadata":{
"type": "nested",
"properties":{
"wikipedia_url":{
"type": "keyword"
},
"mid":{
"type": "keyword"
}
}
}
}
},
"sentiment":{
"type": "nested",
"properties":{
"score":{
"type":"integer"
},
"magnitude":{
"type":"integer"
}
}
}
}
},
"url":{
"type": "keyword"
},
"publication_date":{
"type": "date",
"format": "date_hour_minute_second"
}
}
}
}
}
... где единственное различие между ним и "закладками" - это вложенный тип объекта meta_information
.
Кроме того, вот код, который записывает данные:
$data = array(
'user_id' => $this->flexi_auth->get_user_id(),
'title' => strip_tags( $title ),
'note' => strip_tags( $note ),
'creation' => str_replace( ' ', 'T', date("Y-m-d H:i:s") ),
'modification' => str_replace( ' ', 'T', date("Y-m-d H:i:s") ),
'publication_date' => $date,
'url' => $url,
'links_to_asset' => [],
'meta_information' => [
'entities' => $metaInformation['entities'],
'sentiment' => $metaInformation['sentiment']
],
'favourite' => 0,
'deleted' => 0
);
$params = array(
'index' => "experiment",
'type' => "experiment",
'id' => $note_id
);
$this->elasticsearch_model->addAssetData(
$data, $params
);
... и в модели:
public function addAssetData ($data, $params) {
try {
if (!isset($params['index']) || !isset($params['type']))
die ("Unable to add Elastic index for an Asset. Either index or type is not defined.");
$client = $this->_client;
foreach ($data as $_id => $insert) {
$params['body'][$_id] = $insert;
}
$responses = $client->index($params);
return $responses;
} catch (Exception $e) {
return $e->getMessage();
}
}
Вот где Elastic вмешивается, иногда выбирает запись данных на основе этих параметров, затем - через некоторое время и наугад - игнорирует массив meta_information
и переключается на индекс: "закладки "и введите:" закладка ".
Я также использую официальный пакет Elastic PHP .
Я использовал var_dump($data, $params)
бесчисленное количество раз, и значения верны, но то, решит ли Elastic использовать эти данные, находится на коленях у богов.