1

这可能是我正在尝试做的非常特别的事情。我正在运行一条“河流”来动态索引我的 couchdb 中的所有数据。
当多个用户向系统输入数据时,有时会出现映射冲突 ( MapperParser Error)。例如:

  • userA添加以下数据{"tweet" : {"fooval" : "1"}} ——elasticSearch 为这个tweet.fooval变量创建一个映射为Number(因为它解释为一个数字)
  • userB添加以下数据 - {"tweet" : {"fooval" : "false"}} elasticSearch 尝试将此tweet.fooval变量的映射创建为布尔值(因为它将其解释为布尔值),因此会出现 MapperParser Error

我想你看到了问题。此外,我只想在标量类型的级别上执行此操作,因为我不希望将数组/对象视为字符串。我希望在创建映射时将所有标量类型都视为字符串。

我在文档页面或论坛上找不到任何东西,所以思想会在这里询问方向/指针。

4

1 回答 1

2

首先,默认情况下,elasticsearch 是不解析字符串的。因此,如果您将以下 JSON 传递给 elasticsearch:{"tweet": {"fooval": "1"}}它将被tweet.fooval视为字符串。如果 elaticsearch 正在解析字符串,请确保在映射numeric_detection中将anddate_detection设置为 false 。

另一方面,如果elasticsearch接收到一个像这样的JSON数字的值:{"tweet": {"fooval": 1}},elasticsearch确实会将这样的字段映射为long或double。您可以使用 dynamic_templates 覆盖此行为。这是一个例子:

curl -XPUT localhost:9200/test-idx -d '{
    "settings": {
        "index.number_of_replicas": 0,
        "index.number_of_shards": 1
    },
    "mappings": {
        "doc": {
            "dynamic_templates" : [
                {
                    "template_obj" : {
                        "match" : "*",
                        "match_mapping_type" : "object",
                        "mapping" : {
                            "type" : "object"
                        }
                    }
                },
                {
                    "template_str" : {
                        "match" : "*",
                        "mapping" : {
                            "type" : "string"
                        }
                    }
                }            
            ]
        }
    }
}'
curl -XPUT localhost:9200/test-idx/doc/1 -d '{
    "count": 123,
    "sold": false,
    "date": "2009-11-15T14:12:12",
    "price": 12.3,
    "description": {
        "weight":  42.3,
        "size": {
            "lenght": 30,
            "width": 20,
            "hight": 10
        }
    }
}'
echo
curl "localhost:9200/test-idx/doc/_mapping?pretty=true"
于 2013-01-09T01:17:40.963 回答