【问题标题】:illegal_argument_exception request contains unrecognized parameter: [mapping] - ElasticSearch Index Creation非法参数异常请求包含无法识别的参数:[映射] - ElasticSearch 索引创建
【发布时间】:2017-07-07 13:54:27
【问题描述】:

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

我的主要目标是使用 Node.js + ElasticSearch 完成一个 crud。现在我坚持使用mapping 功能创建索引。

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

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

任何建议检查什么将不胜感激。

另外,虽然不是我的主要问题的一部分,但任何评论如何正确地将 get 和 search 函数返回到 response.send(JSON.stringify(the data from elasticsearch)) 以及如何将 post_date 映射到日期类型而不是字符串将不胜感激,因为我坚持也是。

到目前为止,我已经尝试过以下所有内容。当我尝试不使用mapping 功能时,我可以看到抛出“Chrome ElastiSearch ToolBox 扩展”,就像下面的addToIndex 一样,它确实有效,但我希望有单独的功能,一个用于创建索引,我将只运行一次显然,另一个用于创建“记录”,这将成为我的一部分。

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

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)

我的控制器 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"
  }
}

【问题讨论】:

  • Promise.resolve().then(createIndexWithMapping) .... 看起来不对。你认为你用这段代码实现了什么?
  • 您是否尝试按照此处的建议将“mappings”属性置于“body”属性中? stackoverflow.com/a/25456701/2848895
  • Jaromanda,我知道我正在创建索引。这是我第一次使用 ELlasticSearch。作为一个简单的类比,“我想创建空数据库”。 PS。我知道数据库在 ElasticSearch 中不是正确的术语,但您可能可以理解我想用这条评论做什么。在gist.github.com/StephanHoyer/b9cd6cbc4cc93cee8ea6 你可以看到类似的想法:“... client.indices.create({ index: 'test', mapping: { house: { name: { type: 'string'...
  • @DemeCarvO,请检查我的答案

标签: node.js elasticsearch npm promise elasticsearch-plugin


【解决方案1】:

根据elasticsearch.js » 5.5 API Doc

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

参数

  • 身体

Object, JSON — 可选的请求正文,作为 JSON 或 JSON 可序列化对象。有关可以在此处指定的内容的详细信息,请参阅 elasticsearch 文档。

并根据API Convension doc

通用参数

  • 身体

字符串,任何东西 — 与此请求一起发送的正文。如果正文是字符串,则将按原样传递,否则将传递给序列化程序并转换为 JSON 或基于 API 方法的换行符分隔的 JSON 对象列表。

所以您应该将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: {
                // ...
            },
        },
    }
});

【讨论】:

    【解决方案2】:

    通用参数

    身体

    Anything — 与此请求一起发送的正文。如果正文是一个字符串,它将按原样传递,否则,它会传递给序列化程序并转换为 JSON 或基于 API 方法的换行符分隔的 JSON 对象列表。

    不要忘记在声明“映射”之前添加“body”

    示例:

        function createIndices() {
            return client.indices.create({
              index: "indicesName",
              body: {
                mappings: {
                  text: {
                    properties: {
                      id: {
                        type: "integer"
                      },
                      label: {
                        type: "keyword"
                      },
                      state: {
                        type: "keyword"
                      },
                      startTime: {
                        type: "date",
                        format: "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd HH:mm:ss.SSS||yyyy-MM-dd'T'HH:mm:ssZZ"
                      },
                      updateTime: {
                        type: "date",
                        format: "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd HH:mm:ss.SSS||yyyy-MM-dd'T'HH:mm:ssZZ"
                      }
                    }
                  }
                }
              }
            });
          }
    

    输出:

      {
          "acknowledged": true,
          "shards_acknowledged": true,
          "index": "indicesName"
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-02
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多