我需要使用其他字段更新映射,但是决定先创建一个实验性映射,然后向其中写入文档以清除问题。
在这里,原始的是:
"index": "bookmark",
"type": "bookmark"
...而实验是:
"index": "experiment",
"type": "experiment"
碰巧,整个过程在第一次询问时就起作用了,但随后的下一个文档却没有,而是写入了“书签”索引。
我已经花了几个小时来更改索引和类型的名称,尽管有时它会一次或可能多次写入“实验”索引,但随后它会切换到“书签”而无需恢复。
在应用程序中,有两个对索引和类型的引用,并且都作为数组传递给处理弹性工作的类。
如果删除要传递给Elastic的文档的“数据”数组,它将不会写入数据,我想应该是显而易见的,但是在正常情况下,它会忽略“ meta_information”对象,索引和类型。
值得注意的是,这是一个成熟的应用程序,自5.6以来一直在使用Elastic而没有错误。
这种行为是无法解释的,并且根据代码,这也是不可能的。
就两个映射之间的差异而言,实验是:有一个附加的“嵌套”对象;和其他“类型”。
我正在使用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
数组并切换到索引:“书签”,然后输入:“书签”。
我也在使用the official Elastic PHP package。
我已经使用var_dump($data, $params)
了无数次,并且这些值都是正确的,但是Elastic是否选择使用该数据是众神所为。