node.js - 非法参数异常请求包含无法识别的参数: [mapping] - ElasticSearch Index Creation

标签 node.js elasticsearch npm promise elasticsearch-plugin

从昨天起我第一次使用elasticsearch,由于我的知识有限,经过两天的工作,我正在努力启动和运行简单的功能。

我的主要目标是使用 Node.js + ElasticSearch 完成任务。现在我不得不使用 mapping 功能创建索引。

我的直接问题是:我必须做什么才能使这段代码正常工作?

return client.indices.create({
    index: 'index_created_with_map',
    mapping: {
        posts: {
            user: {
                type: 'string'
            },
            post_date: {
                type: 'string'
            },
            message: {
                type: 'string'
            }
        }
    }
});

任何检查内容的建议将不胜感激。

此外,尽管不是我的主要问题的一部分,但任何评论如何正确地将获取和搜索功能返回到 response.send(JSON.stringify(the data from elasticsearch)) 以及如何将 post_date 映射到日期类型而不是字符串将受到赞赏,因为我也陷入困境。

贝娄是我迄今为止所尝试过的。当我尝试不使用mapping功能(如下面的addToIndex)时,我可以看到抛出“Chrome ElastiSearch ToolBox扩展”,它确实可以工作,但我希望有单独的功能,一个用于创建显然我只会运行一次索引,另一个用于创建“记录”,这将成为我的 CRUD 的一部分。

PS。我在这里发现了非常相似的问题,但没有任何答案

illegal_argument_exception: no mapping found for field

错误日志:

Unhandled rejection Error: [illegal_argument_exception] request [/index_created_with_map] contains unrecognized parameter: [mapping]
    at respond (/home/demetrio/dev/WSs/NodeJs/greencard-dmz-es-oracle/node_modules/elasticsearch/src/lib/transport.js:289:15)
    at checkRespForFailure (/home/demetrio/dev/WSs/NodeJs/greencard-dmz-es-oracle/node_modules/elasticsearch/src/lib/transport.js:248:7)
    at HttpConnector.<anonymous> (/home/demetrio/dev/WSs/NodeJs/greencard-dmz-es-oracle/node_modules/elasticsearch/src/lib/connectors/http.js:164:7)
    at IncomingMessage.wrapper (/home/demetrio/dev/WSs/NodeJs/greencard-dmz-es-oracle/node_modules/lodash/lodash.js:4968:19)
    at emitNone (events.js:72:20)
    at IncomingMessage.emit (events.js:166:7)
    at endReadableNT (_stream_readable.js:905:12)
    at nextTickCallbackWith2Args (node.js:441:9)
    at process._tickCallback (node.js:355:17)

我的 Controller NodeJs

var elasticsearch = require('elasticsearch');
var Promise = require('bluebird');

exports.teste = function (req, res) {

    var log = console.log.bind(console);

    var client = new elasticsearch.Client({
        host: 'localhost:9200',
        log: 'trace'
    });

    function createIndexWithMapping() {
        return client.indices.create({
            index: 'index_created_with_map',
            mapping: {
                posts: {
                    user: {
                        type: 'string'
                    },
                    post_date: {
                        type: 'string'
                    },
                    message: {
                        type: 'string'
                    }
                }
            }
        });
    }

    function createIndexWithoutMapping() {
        return client.create({
            index: 'index_created_without_map',
            type: 'posts',
            id: '1',
            body: {
                user: 'me',
                post_date: new Date(),
                message: 'Hello World!'
            },
            refresh: true
        });
    }

    function addToIndex() {
        return client.index({
            index: 'index_created_...according to the test',
            type: 'posts',
            id: '1',
            body: {
                user: 'me2',
                post_date: new Date(),
                message: 'Hello World!2'
            },
            refresh: true
        });
    }

    function search() {
        return client.search({
            index: 'index_created_...according to the test',
            type: 'posts',
            body: {
                query: {
                    match: {
                        body: 'Hello'
                    }
                }
            }
        }).then(log);
    }

    function getFromIndex() {
        return client.get({
            index: 'index_created_...according to the test',
            type: 'posts',
            id: 1
        }).then(log);
    }


    function closeConnection() {
        client.close();
    }

    Promise.resolve()
        .then(createIndexWithMapping)
        //.then(createIndexWithoutMapping)
        //      .then(addToIndex)
        //    .then(search)
        //  .then(getFromIndex)
        .then(closeConnection);

    return res.send("a");

};

package.json

{
  "name": "my-first-elasticsearch-app",
  "main": "server.js",
  "dependencies": {
    "bcrypt-nodejs": "0.0.3",
    "body-parser": "^1.0.2",
    "ejs": "^1.0.0",
    "elasticsearch": "^12.1.3",
    "express": "^4.1.1",
    "express-session": "^1.6.1",
    "mongoose": "^3.8.8",
    "node-rest-client": "^2.5.0",
    "oauth2orize": "^1.0.1",
    "passport": "^0.2.0",
    "passport-http": "^0.2.2",
    "passport-http-bearer": "^1.0.1",
    "reqclient": "^2.1.0"
  }
}

最佳答案

根据elasticsearch.js » 5.5 API Doc

client.indices.create([params, [callback]])

Params

  • body

Object, JSON — An optional request body, as either JSON or a JSON serializable object. See the elasticsearch docs for details about what can be specified here.

根据API Convension doc

Generic Parameters

  • body

String, Anything — The body to send along with this request. If the body is a string it will be passed along as is, otherwise it is passed to the serializer and converted to either JSON or a newline separated list of JSON objects based on the API method.

因此,您应该将 mapping 属性作为 body 属性内的请求正文发送

一个工作示例:

const es = require('elasticsearch');

const elasticsearchClient = new es.Client({
    host: 'localhost:9200',
    log: 'trace',
});

elasticsearchClient.indices.create({
    index: `index_created_with_map`,
    body: {
        mappings: {
            type_name: {
                // ...
            },
        },
    }
});

关于node.js - 非法参数异常请求包含无法识别的参数: [mapping] - ElasticSearch Index Creation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42308090/

相关文章:

node.js - 在不访问数据库的情况下测试 Hapijs 端点

javascript - node.js如何调用mongodb集合getall?

node.js - Webpack @azure/storage-blob node-fetch AbortSignal 问题

elasticsearch - 导出/导入 Kibana 4 保存的搜索、可视化和仪表板

java - Elasticsearch,嵌套 "ANDS"和 "ORS"

.net - 使用Nest创建弹性索引

node.js - 是否可以仅在尚未安装 npm 包的情况下安装它?

node.js - 将 nguniversal/express-engine 添加到 Angular proj : "Cannot find BrowserModule import in/src/app/app.module.ts"

node.js - KeystoneJS 变量相关帖子

node.js - npm run-如果手动输入了启动命令,则会抛出找不到错误的命令