相对较新的javascript和angular。我正在使用Elasticsearch实例来摄取/索引不同的文件。该webapp应该具有允许用户上传多个文件的功能,然后将使用摄取处理器对其进行处理并编入ES。我正在使用angular-base64-upload提取base64数据。以下是我到目前为止尝试过的。
html:
<div ng-switch-when="upload">
...
<input type="file" ng-model="obj.files" name="files"
base-sixty-four-input multiple>
...
<div ng-show="obj.files.length != 0">
<button class="btn btn-primary" type="submit" ng-click="ingest()">
Index All {{obj.files.length}} Files
</button> <br><br>
</div>
</div>
我的控制器中的javascript ingest()函数代码:
//Ingesting multiple files
$scope.obj = {files: []};
$scope.ingest = function () {
$scope.obj.files.forEach(function (file){
var fname = file.filename.replace(/\.[^/.]+$/, "");
var fdata = file.base64;
//Creating the pipeline
console.log('filename is: ' + fname);
$http({
url: 'http://192.168.100.30:9200/_ingest/pipeline/attachment',
method: "PUT",
data: {
"description" : "Indexing files",
"processors" : [
{
"set" : {
"field" : "filename",
"value" : fname
},
"attachment" : {
"field" : "data"
}
}
]
}
})
.then(function(allowed){
//Indexing the document
$http({
url: 'http://192.168.100.30:9200/my_index4/my_type/'+fname+'?pipeline=attachment', //unique ID for every document, ensures that there are no overlaps
method: "PUT",
data: {
"data": fdata
}
})
})
})
}
控制台日志记录仅用于调试目的。
我遇到的问题是,当Elastic将文件存储在正确的_id下时(在我的情况下是文件名),它没有存储正确的field: filename
。例如,如果我上传2个名为hello.txt和world.txt的文件,则ES会将两个分别以hello
和world
分别作为_id
的文件存储,但是{{1} }字段经常被交换,或者通常是不正确的。我已经多次运行该代码以查看是否存在一种模式,但我似乎并没有真正找到一个模式。
filename
显示console.log
是第一个fname
之前,之后和第二个http
之后的正确文件名,这就是我感到困惑的原因http
处理器未正确存储的原因。
由于这个问题有点令人费解,所以我可能没有很好地清楚地解释这个问题。让我知道是否需要进一步说明。谢谢!