illegal_argument_exception请求包含无法识别的参数:[mapping] - ElasticSearch Index Creation

时间:2017-02-17 21:57:15

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

自从昨天以来我第一次使用弹性搜索,由于我的知识有限,我在努力工作两天后仍在努力获得简单的功能。

我的主要目标是使用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映射到日期类型而不是字符串将被视为我也坚持下去。

到目前为止,我已经尝试过贝娄。我可以看到" Chrome ElastiSearch ToolBox扩展程序"当我尝试没有像mapping下面的addToIndex功能时,它确实有效,但我希望有单独的功能,一个用于创建索引,我将只运行一次,另一个用于创建&#34 ;记录"这将是我的一部分。

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)

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

2 个答案:

答案 0 :(得分:1)

根据elasticsearch.js » 5.5 API Doc

  

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

     

<强> PARAMS

     
      
  •   
     

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

根据API Convension doc

  

通用参数

     
      
  •   
     

String,Anything - 与此请求一起发送的正文。如果正文是一个字符串,它将按原样传递,否则它将传递给序列化程序并根据API方法转换为JSON或换行符分隔的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: {
                // ...
            },
        },
    }
});

答案 1 :(得分:1)

通用参数

任何内容 - 与此请求一起发送的正文。如果正文是一个字符串,它将按原样传递,否则,它将被传递给序列化程序,并根据API方法转换为JSON或新行分隔的JSON对象列表。

在宣布“映射”之前不要忘记添加“正文”

示例:

    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"
  }