如何设置所有标量类型(数字/布尔/字符串等)设置为在动态映射期间键入“string”(使用河流插件)

时间:2013-01-08 23:22:26

标签: couchdb elasticsearch

这可能是我想要做的非常奇怪的事情。我正在运行一条“河流”来动态索引我的couchdb中的所有数据 当多个用户将数据输入系统时,有时映射中存在冲突(MapperParser Error)。例如:

  • userA 添加以下数据 - {"tweet" : {"fooval" : "1"}} - elasticSearch为此tweet.fooval变量创建一个映射为数字(因为它将其解释为数字)
  • userB 添加以下数据 - {"tweet" : {"fooval" : "false"}} - elasticSearch尝试为此tweet.fooval变量创建映射为布尔(因为它将其解释为布尔值)和因此导致MapperParser错误

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

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

1 个答案:

答案 0 :(得分:2)

首先,默认情况下,elasticsearch不会解析字符串。因此,如果您将传递给elasticsearch以下JSON:{"tweet": {"fooval": "1"}}它会将tweet.fooval视为字符串。如果elaticsearch正在解析字符串,请确保mapping中的numeric_detectiondate_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"