更新elasticsearch中的默认索引映射

时间:2015-01-07 12:29:41

标签: elasticsearch

我想在弹性搜索中为我的索引更新默认映射。但是所有的文档都指出我们必须提供更新映射的类型。问题是我有很多索引类型,它们是动态创建的,就像出现新类型的文档时一样。因此,处理的最佳方法是默认映射类型。因为我没有为每种类型定义映射。但现在我无法更新索引默认映射。如果有可能请告诉我?

1 个答案:

答案 0 :(得分:0)

我使用default mapping如下:

我创建了索引,指定了_default_映射。在这种情况下,我只有一个字段,但我想确保它不会被分析(所以我可以做各种类型的分面,比如说):

curl -XDELETE "http://localhost:9200/test_index"

curl -XPUT "http://localhost:9200/test_index" -d'
{
   "mappings": {
      "_default_": {
         "properties": {
            "title": {
               "type": "string",
               "index": "not_analyzed"
            }
         }
      }
   }
}'

然后我创建了几个不同类型的文档:

curl -XPUT "http://localhost:9200/test_index/doc_type1/1" -d'
{ "title": "some text" }'

curl -XPUT "http://localhost:9200/test_index/doc_type2/2" -d'
{ "title": "some other text" }'

因此,将动态生成每种类型的映射,并包含"title"的默认映射。我们可以通过查看映射来看到这一点:

curl -XGET "http://localhost:9200/test_index/_mapping"
...
{
   "test_index": {
      "mappings": {
         "_default_": {
            "properties": {
               "title": {
                  "type": "string",
                  "index": "not_analyzed"
               }
            }
         },
         "doc_type2": {
            "properties": {
               "title": {
                  "type": "string",
                  "index": "not_analyzed"
               }
            }
         },
         "doc_type1": {
            "properties": {
               "title": {
                  "type": "string",
                  "index": "not_analyzed"
               }
            }
         }
      }
   }
}

如果我在title字段上面对,我会回到我的期望:

curl -XPOST "http://localhost:9200/test_index/_search" -d'
{
    "size": 0, 
    "facets": {
       "title_values": {
          "terms": {
             "field": "title",
             "size": 10
          }
       }
    }
}'
...
{
   "took": 1,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 2,
      "max_score": 0,
      "hits": []
   },
   "facets": {
      "title_values": {
         "_type": "terms",
         "missing": 0,
         "total": 2,
         "other": 0,
         "terms": [
            {
               "term": "some text",
               "count": 1
            },
            {
               "term": "some other text",
               "count": 1
            }
         ]
      }
   }
}

以下是我使用的代码:

http://sense.qbox.io/gist/05c503ce9ea841ca4013953b211e00dadf6f1549

这会回答你的问题吗?

编辑:以下是更新现有索引的_default_映射的方法:

curl -XPUT "http://localhost:9200/test_index/_default_/_mapping" -d'
{
   "_default_": {
      "properties": {
         "title": {
            "type": "string",
            "index": "not_analyzed"
         },
         "name": {
            "type": "string",
            "index": "not_analyzed"
         }
      }
   }
}'

(顺便说一句,我使用Elasticsearch 1.3.4版本来解决这个问题。)