Mongoosastic不会在保存时编制索引

时间:2019-02-06 15:08:09

标签: node.js elasticsearch mongoose mongoosastic

我有一个这样定义的猫鼬模型。

const custSchema = new mongoose.Schema({
    name: {
        type: String,
        es_indexed: true,
        es_type: text
    },
    phoneNumber: {
        type: String,
        es_indexed: true,
        es_type: String
    },
    email: String
})

custSchema.plugin(mongoosastic);

const Cust = module.exports = mongoose.model('Cust', custSchema);


Cust.createMapping(function(err, mapping) {
    if(err) {
        console.log(err)
    } else {
        console.log(mapping);
    }
});

let count = 0;
const stream = Cust.synchronize();

stream.on('data', () => {
    count = count + 1;
})

stream.on('close', () => {
    console.log("Total " + count + " documents indexed");
})

stream.on('error', (err) => {
    console.log(err)
});

当我将新集合添加到Cust时,除非重新启动服务器,否则不会将新文档添加到elasticsearch中。

如何解决此问题?

1 个答案:

答案 0 :(得分:0)

对此进行了一段时间的努力,直到我发现问题与ElasticSearch从v5升级到v6有关,“类型”成为弃用的候选对象(在v7中已完全删除),并且不再允许使用多个类型。该库很可能会强制使用自己的“类型”(在您的情况下,可能是“客户”之外还有“ _doc”),但是我们需要手动将Monososastic中的一种类型设置为“ _doc”(对于ElasticSearch v6是必需的)。

首先,删除可能导致索引和类型冲突的原始索引。

然后,在您的模型中更改

custSchema.plugin(mongoosastic);

custSchema.plugin(mongoosastic, {
  type: '_doc'
});

在插件部分更改此选项后,创建一个新索引

stream.on("data", function(err, doc) {
  client.indices.create({
    index: 'customers',
    body: {
      doc
    }
  }, function (error, response) {
    console.log(response);
  });

解决起来很痛苦,希望这也可以帮助其他一些人避免头痛。