1.禁用 _source 字段

PUT /my_index
 {
     "mappings": {
         "my_type": {
             "_source": {
                 "enabled":  false
             }
         }
     }
 }
 2.在一个搜索请求里,你可以通过在请求体中指定 _source 参数,来达到只获取特定的字段的效果:GET /_search
 {
     "query":   { "match_all": {}},
     "_source": [ "title", "created" ]
 }3._all 字段在新应用的探索阶段,当你还不清楚文档的最终结构时是比较有用的。你可以使用这个字段来做任何查询,并且有很大可能找到需要的文档:
GET /_search
 {
     "match": {
         "_all": "john smith marketing"
     }
 }4.如果你不再需要 _all 字段,你可以通过下面的映射来禁用:
 PUT /my_index/_mapping/my_type
 {
     "my_type": {
         "_all": { "enabled": false }
     }
 }5.相对于完全禁用 _all 字段,你可以为所有字段默认禁用 include_in_all 选项,仅在你选择的字段上启用
 PUT /my_index/my_type/_mapping
 {
     "my_type": {
         "include_in_all": false,
         "properties": {
             "title": {
                 "type":           "string",
                 "include_in_all": true
             },
             ...
         }
     }
 }6._all 字段仅仅是一个 经过分词的 string 字段。它使用默认分词器来分析它的值,不管这个值原本所在字段指定的分词器。就像所有 string 字段,你可以配置 _all 字段使用的分词器:
PUT /my_index/my_type/_mapping
 {
     "my_type": {
         "_all": { "analyzer": "whitespace" }
     }
 }7.动态映射
 PUT /my_index
 {
     "mappings": {
         "my_type": {
             "dynamic":      "strict", 
             "properties": {
                 "title":  { "type": "string"},
                 "stash":  {
                     "type":     "object",
                     "dynamic":  true 
                 }
             }
         }
     }
 }
 注:如果遇到新字段,对象 my_type 就会抛出异常。而内部对象 stash 遇到新字段就会动态创建新字段。使用上述动态映射, 你可以给 stash 对象添加新的可检索的字段:
PUT /my_index/my_type/1
 {
     "title":   "This doc adds a new field",
     "stash": { "new_field": "Success!" }
 }但是对根节点对象 my_type 进行同样的操作会失败:
 PUT /my_index/my_type/1
 {
     "title":     "This throws a StrictDynamicMappingException",
     "new_field": "Fail!"
 }7.日期检测可以通过在根对象上设置 date_detection 为 false 来关闭:
PUT /my_index
 {
     "mappings": {
         "my_type": {
             "date_detection": false
         }
     }
 }8.动态模板:
 例如,我们给 string 类型字段定义两个模板:
 es :以 _es 结尾的字段名需要使用 spanish 分词器。
 en :所有其他字段使用 english 分词器。PUT /my_index
 {
     "mappings": {
         "my_type": {
             "dynamic_templates": [
                 { "es": {
                       "match":              "*_es", 
                       "match_mapping_type": "string",
                       "mapping": {
                           "type":           "string",
                           "analyzer":       "spanish"
                       }
                 }},
                 { "en": {
                       "match":              "*", 
                       "match_mapping_type": "string",
                       "mapping": {
                           "type":           "string",
                           "analyzer":       "english"
                       }
                 }}
             ]
 }}}match_mapping_type 允许你应用模板到特定类型的字段上,就像有标准动态映射规则检测的一样, (例如 string 或 long)。
match 参数只匹配字段名称, path_match 参数匹配字段在对象上的完整路径,所以 address.*.name 将匹配这样的字段:
 {
     "address": {
         "city": {
             "name": "New York"
         }
     }
 }unmatch 和 path_unmatch将被用于未被匹配的字段。
9.缺省映射:通常,一个索引中的所有类型共享相同的字段和设置。 _default_ 映射更加方便地指定通用设置,而不是每次创建新类型时都要重复设置。 _default_ 映射是新类型的模板。
 在设置 _default_ 映射之后创建的所有类型都将应用这些缺省的设置,除非类型在自己的映射中明确覆盖这些设置。
 例如,我们可以使用 _default_ 映射为所有的类型禁用 _all 字段, 而只在 blog 类型启用:
 PUT /my_index
 {
     "mappings": {
         "_default_": {
             "_all": { "enabled":  false }
         },
         "blog": {
             "_all": { "enabled":  true  }
         }
     }
 }

10.重建索引:
对现有数据的这类改变最简单的办法就是重新索引:用新的设置创建新的索引并把文档从旧的索引复制到新的索引。

字段 _source 的一个优点是在Elasticsearch中已经有整个文档。你不必从源数据中重建索引,而且那样通常比较慢。

为了有效的重新索引所有在旧的索引中的文档,用 scroll 从旧的索引检索批量文档 , 然后用 bulk API 把文档推送到新的索引中。

从Elasticsearch v2.3.0开始, Reindex API 被引入。它能够对文档重建索引而不需要任何插件或外部工具。

2.批量重新索引:同时并行运行多个重建索引任务,但是你显然不希望结果有重叠。正确的做法是按日期或者时间 这样的字段作为过滤条件把大的重建索引分成小的任务:

GET /old_index/_search?scroll=1m
 {
     "query": {
         "range": {
             "date": {
                 "gte":  "2014-01-01",
                 "lt":   "2014-02-01"
             }
         }
     },
     "sort": ["_doc"],
     "size":  1000
 }如果旧的索引会持续变化,你希望新的索引中也包括那些新加的文档。那就可以对新加的文档做重新索引, 但还是要用日期类字段过滤来匹配那些新加的文档。
11.索引别名和零停机
 有两种方式管理别名: _alias 用于单个操作, _aliases 用于执行多个原子级操作。
 在本章中,我们假设你的应用有一个叫 my_index 的索引。事实上, my_index 是一个指向当前真实索引的别名。真实索引包含一个版本号: my_index_v1 , my_index_v2 等等。首先,创建索引 my_index_v1 ,然后将别名 my_index 指向它:
 PUT /my_index_v1 
 PUT /my_index_v1/_alias/my_index 你可以检测这个别名指向哪一个索引:GET /*/_alias/my_index
 或哪些别名指向这个索引:GET /my_index_v1/_alias/*
 两者都会返回下面的结果:
 {
     "my_index_v1" : {
         "aliases" : {
             "my_index" : { }
         }
     }
 }然后,我们决定修改索引中一个字段的映射。当然,我们不能修改现存的映射,所以我们必须重新索引数据。 首先, 我们用新映射创建索引 my_index_v2 :
 PUT /my_index_v2
 {
     "mappings": {
         "my_type": {
             "properties": {
                 "tags": {
                     "type":   "string",
                     "index":  "not_analyzed"
                 }
             }
         }
     }
 }
 然后我们将数据从 my_index_v1 索引到 my_index_v2 ,下面的过程在 重新索引你的数据 中已经描述过。一旦我们确定文档已经被正确地重索引了,我们就将别名指向新的索引。2.一个别名可以指向多个索引,所以我们在添加别名到新索引的同时必须从旧的索引中删除它。这个操作需要原子化,这意味着我们需要使用 _aliases 操作:
 POST /_aliases
 {
     "actions": [
         { "remove": { "index": "my_index_v1", "alias": "my_index" }},
         { "add":    { "index": "my_index_v2", "alias": "my_index" }}
     ]
 }
 你的应用已经在零停机的情况下从旧索引迁移到新索引了。4.POST /_refresh  刷新(Refresh)所有的索引。
POST /blogs/_refresh   只刷新(Refresh) blogs 索引。
     
 5.设置 refresh_interval , 降低每个索引的刷新频率
 PUT /my_logs
 {
   "settings": {
     "refresh_interval": "30s" 
   }
 }refresh_interval 可以在既存索引上进行动态更新。 在生产环境中,当你正在建立一个大的新索引时,可以先关闭自动刷新,待开始使用该索引时,再把它们调回来
 PUT /my_logs/_settings
 { "refresh_interval": -1 }   关闭自动刷新。PUT /my_logs/_settings
 { "refresh_interval": "1s" }  每秒自动刷新