使用Elastic Search Javascript API索引批量数据

时间:2018-07-27 01:42:50

标签: node.js elasticsearch

背景

在我的节点应用程序中,我试图索引SQL表中返回的值。我一直在阅读文档,我认为我应该使用批量功能来做到这一点。我正在尝试使用嵌套的数据类型,但发现文档尚不清楚。

这里有三个功能。

  
      
  1. 索引
  2.   
  3. putMapping
  4.   
  5. 批量
  6.   

当我尝试添加一个索引时,它可以正常工作。但是,当我尝试添加批量索引时,它说该索引不存在。这使我假设需要创建索引,然后使用putMapping添加嵌套映射。无论哪种方式,我都会遇到错误。我最近收到错误消息

  

“请求正文为必填项”},“状态”:400}',

问题

尝试创建没有主体键的索引时出现此错误。我当时想我需要先使用映射创建索引,这样我才能输入大量数据。我认为我的问题是我没有使用正确的功能。

示例

索引

exports.createIndex = () => {
    esClient.index({
        index: "products",
        type: "product",
        refresh: "true"
    }, (error, response) => {
        if(error) {
            console.log('Put Index Error ', error);
        } else {
            this.createMapping();
            console.log('Put Index Response ', response);
        }
    });
};

putMapping

exports.createMapping = () => {
    esClient.indices.putMapping({
        index: "products",
        type: "product",
        body: {
            mappings: {
                product: {
                    properties: {
                        variantId: { type: "text" },
                        productId: { type: "text" },
                        keyStrengths: { type: "text" },
                        something: {
                            type: "nested",
                            properties: {
                                type: { type: "text" },
                                label: { type: "text" },
                                items: {
                                    type: "nested",
                                    properties: {
                                        value: {
                                            type: "text"
                                        },
                                        characteristic: {
                                            type: "text"
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }, (error, response) => {
        if(error) {
            console.log('Put Index Error ', error);
        } else {
            console.log('Put Index Response ', response);
        }
    });
};

批量

   esClient.bulk({})

问题

请告诉我创建新索引的正确方法,然后批量插入从数据库返回的数据。我不清楚是否需要使用所有这三个功能,或者我在哪里出错了。

  

我的目标是批量插入具有以下内容的对象的数组   其中的物体。

1 个答案:

答案 0 :(得分:2)

您没有使用正确的功能。 esClient.index()旨在为文档建立索引,而不是创建索引。针对您的情况,正确的做法是调用esClient.indices.create(),以便使用适当的映射创建索引,然后可以调用esClient.bulk()。它是这样的:

exports.createIndex = () => {
    esClient.indices.create({
        index: "products",
        body: {
            mappings: {
                product: {
                    properties: {
                        variantId: { type: "text" },
                        productId: { type: "text" },
                        keyStrengths: { type: "text" },
                        something: {
                            type: "nested",
                            properties: {
                                type: { type: "text" },
                                label: { type: "text" },
                                items: {
                                    type: "nested",
                                    properties: {
                                        value: {
                                            type: "text"
                                        },
                                        characteristic: {
                                            type: "text"
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }, (error, response) => {
        if(error) {
            console.log('Create Index Error ', error);
        } else {
            console.log('Create Index Response ', response);
        }
    });
};

完成后,您可以调用esClient.bulk()并从数据库中提取数据。