Elasticsearch映射和字段类型

时间:2017-02-15 12:15:32

标签: elasticsearch

你好Elasticsearch Gurus。

给出以下索引和doctype:    本地主机:9200 / myindex / mydoctype

我目前有这个索引定义:

{
  "myindex": {
    "aliases": {},
    "mappings": {
      "mydoctype": {
        "properties": {
          "theNumber": {
            "type": "integer"
          },
          "theString": {
            "type": "string"
          }
        }
      }
    },
    "settings": {
      "index": {
        "creation_date": "1487158714808",
        "number_of_shards": "5",
        "number_of_replicas": "1",
        "version": {
          "created": "1070599"
        },
        "uuid": "cm2OtivhTO-RjuZPeHvL1w"
      }
    },
    "warmers": {}
  }
}

我能够添加这个文件:

{
    "theNumber" : 0,
    "theString" : "zero"
}

但我没想到的是,我也可以添加这个文件:

{
    "theNumber" : 3.1418,
    "theString" : 3,
    "fiefoe" : "fiefoe"
}

...字段类型不匹配的地方。 除了引入了新的字段/列之外。 由于我为索引定义的映射,我没想到会出现这种行为。

这是否与Elasticsearch无架构有关? 是否可以将Elasticsearch设置为仅接受为此索引添加的每个文档的那些类型和字段? 这是弹性搜索映射的首要工作方式吗? (也许我不知道呵呵呵)

谢谢=)

2 个答案:

答案 0 :(得分:3)

Elasticsearch使用动态映射,因此当它找到映射中不存在的字段时,它会尝试通过猜测其类型来对其进行索引。 您可以使用dynamic: false在根对象上的映射中禁用此行为。在这种情况下,ElasticSearch将忽略未映射的字段。

 {
  "myindex": {
    "aliases": {},
    "mappings": {
        "mydoctype": {
        "dynamic": false, <-----

        "properties": {
          "theNumber": {
            "type": "integer"
          },
          "theString": {
            "type": "string"
          }
        }
      }
    },
    "settings": {
      "index": {
        "creation_date": "1487158714808",
        "number_of_shards": "5",
        "number_of_replicas": "1",
        "version": {
          "created": "1070599"
        },
        "uuid": "cm2OtivhTO-RjuZPeHvL1w"
      }
    },
    "warmers": {}
  }
}

或者,如果要在未映射的字段尝试编制索引时抛出异常,则可以使用dynamic:strict

此文档为here

答案 1 :(得分:0)

&lt; p&gt;请允许我回答我自己的问题......&lt; / p&gt; &lt; p&gt;在这种情况下,此设置对我有用:&lt; / p&gt; &lt; p&gt; API URL请求:localhost:9200 / myindex / _mapping / mydoctype&lt; / p&gt; &lt; p&gt; HTTP正文:&lt; / p&gt; &LT;预&GT;&LT;代码&GT; {     &#34; mydoctype&#34; :{         &#34;动态&#34;:&#34;严格&#34;,         &#34;属性&#34; :{             &#34;数量写&#34; :{&#34; type&#34; :&#34;整数&#34;},             &#34; theString&#34; :{&#34; type&#34; :&#34; string&#34;},             &#34; stash&#34;:{                     &#34;输入&#34;:&#34;对象&#34;,                     &#34;动态&#34;:假                 }         }     } } &LT; /代码&GT;&LT; /预&GT; &lt; p&gt;然后我尝试添加此对象:&lt; / p&gt; &LT;预&GT;&LT;代码&GT; {     &#34;数量写&#34; :5.55555,     &#34; theString&#34; :5,     &#34; fiefoe&#34; :&#34; fiefoe&#34; } &LT; /代码&GT;&LT; /预&GT; &lt; p&gt;我得到了这个回复:&lt; / p&gt; &LT;预&GT;&LT;代码&GT; {   &#34;错误&#34;:&#34; StrictDynamicMappingException [不允许在[mydoctype]内设置严格,动态引入[fiefoe]]&#34;,   &#34;状态&#34;:400 } &LT; /代码&GT;&LT; /预&GT; &lt; p&gt;谢谢=)!&lt; / p&gt; &LT; p为H. P.S。 参考:    &lt; a href =&#34; https://www.elastic.co/guide/en/elasticsearch/guide/1.x/dynamic-mapping.html" rel =&#34; nofollow noreferrer&#34;&gt; https://www.elastic.co/guide/en/elasticsearch/guide/1.x/dynamic-mapping.html< / a&gt;&lt; / p&gt;