简体   繁体   English

使用 Google Cloud Function 将数据从 firebase firestore 导出到 MeiliSearch

[英]Exporting data from firebase firestore to MeiliSearch using Google Cloud Function

I was working on exporting data from Firebase Firestore to MeiliSearch (And I am new to this) through Cloud Function but the problem was that it was collecting all of the data but in MeiliSearch it was exporting only a chunk, say 400 out of 25k entries, and it became less and less with exporting the data by triggering the function again and again.我正在通过 Cloud Function 将数据从 Firebase Firestore 导出到 MeiliSearch(我是新手),但问题是它正在收集所有数据,但在 MeiliSearch 中它只导出一个块,例如 25k 条目中的 400 个,并且通过一次又一次触发function导出数据变得越来越少。 The meiliSearch is on digital Ocean. meiliSearch 在数字海洋上。 ( Note: It also cost me because Firebase says I had made 27 million calls to firestore:( (注意:这也让我付出了代价,因为 Firebase 说我已经向 Firestore 拨打了 2700 万次电话:(

const functions = require("firebase-functions");
const admin = require("firebase-admin");
const axios = require('axios');
const { default: MeiliSearch } = require("meilisearch");

exports.importToMeili = functions.https.onRequest(async (req, res) => {

    const config={
        host: "http://46.101.197.194",
        apiKey: 'My API Key'
    }

    admin.initializeApp();
    const db = admin.firestore();
    const userCollection = await db.collection("artikli").get();
    const client=new MeiliSearch(config);

    const index=0;
    for(index;index<24752;index++){
        await client.index('artikli').addDocuments([{
            objectID: userCollection.docs[index].id,
            naziv: userCollection.docs[index].n,
            marka: userCollection.docs[index].m,
            model: userCollection.docs[index].mo,
            katBr: userCollection.docs[index].kb,
            id: userCollection.docs[index].id,
            cijena: userCollection.docs[index].c,
            kolicina: userCollection.docs[index].ko,
            lokacija: userCollection.docs[index].l,
            opis: userCollection.docs[index].o,
            image: userCollection.docs[index].u,
            name: userCollection.docs[index].n,
            brand: userCollection.docs[index].brand,
            price: userCollection.docs[index].c.isEmpty ? 0 : instance.c,
            images: userCollection.docs[index].u,
        }]);
    }

    userCollection.docs.map(async doc => {
        const instance = doc.data();

        await client.index('artikli').addDocuments([{
            objectID: doc.id,
            naziv: instance.n,
            marka: instance.m,
            model: instance.mo,
            katBr: instance.kb,
            id: instance.id,
            cijena: instance.c,
            kolicina: instance.ko,
            lokacija: instance.l,
            opis: instance.o,
            image: instance.u,
            name: instance.n,
            brand: instance.brand,
            price: instance.c.isEmpty ? 0 : instance.c,
            images: instance.u,
        }]);

        return {
            objectID: doc.id,
      naziv: instance.n,
      marka: instance.m,
      model: instance.mo,
      katBr: instance.kb,
      id: instance.id,
      cijena: instance.c,
      kolicina: instance.ko,
      lokacija: instance.l,
      opis: instance.o,
      image: instance.u,
      name: instance.n,
      brand: instance.brand,
      price: instance.c.isEmpty ? 0 : instance.c,
      images: instance.u,
        }
    });

    await axios.post(
        `http://46.101.197.194/indexes/artikli/documents`, 
        users,
        { headers: { "X-Meili-API-Key": "MY API KEY"} }
    )
    res.status(200).send()  
});

Now I know that it is taking the whole table data from firestore but don't know why it is not going in meilisearch.现在我知道它正在从 firestore 获取整个表数据,但不知道为什么它不在 meilisearch 中。

MeiliSearch writes data asynchronously in order to continue to receive documents while the previous write requests are being processed by MeiliSearch. MeiliSearch 异步写入数据,以便在 MeiliSearch 处理之前的写入请求时继续接收文档。

What can happen is that your documents are still being indexed or that there was an error during indexing.可能发生的情况是您的文档仍在被索引或索引期间出现错误。

You can view the asynchronous tasks list by using the API endpoint GET /indexes/artikli/updates .您可以使用 API 端点 GET /indexes/artikli/updates查看异步任务列表。 This way you can know when the indexing is finished or why it may have failed.通过这种方式,您可以知道索引何时完成或它可能失败的原因。 The javascript SDK provides methods to check if an update is finished. javascript SDK 提供了检查更新是否完成的方法。 Related methods from the SDK相关方法来自SDK

It is also advised to write your documents in several batches (the bigger the better) in order to mutualize the calculation of data structures that could be entirely recalculated every time you send a document one by one.还建议分几批编写文档(越大越好),以使每次发送文档时都可以完全重新计算的数据结构的计算相互化。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM