Elasticsearch:es.index()在推送消息时更改映射

时间:2016-02-01 17:47:18

标签: python-2.7 elasticsearch kibana-4 elasticsearch-mapping

我正在尝试将这样的消息推送到elasticsearch

id=1
list=asd,bcv mnmn,kjkj, pop asd dgf

所以,每条消息都有一个id字段,这是一个字符串,一个list字段包含一个字符串值列表

当我将其推入弹性并尝试在kibana中创建图表时,默认分析器启动并按空格字符分割我的list。因此它破坏了我的价值观。我试图为我的索引创建一个映射

mapping='''
{ 
"test":
    { 
  "properties": {
        "DocumentID": {
          "type": "string"
        },
        "Tags":{
            "type" : "string",
          "index" : "not_analyzed"
        }
      }
    }
}'''

es = Elasticsearch([{'host': server, 'port': port}])
indexName = "testindex"    
es.indices.create(index=indexName, body=mapping)

所以这应该用我定义的映射创建索引。现在,我只需按

即可推送消息
es.index(indexName, docType, messageBody)

但即使是现在,Kibana打破了我的价值观!为什么没有应用映射?

当我做的时候

GET /testindex/_mapping/test

我得到了

{
  "testindex": {
    "mappings": {
      "test": {
        "properties": {
          "DocumentID": {
            "type": "string"
          },
          "Tags": {
            "type": "string"
          }
        }
      }
    }
  }
}

为什么映射会发生变化?我怎么能在

时指定映射类型
es.index()

2 个答案:

答案 0 :(得分:1)

你非常接近。您需要在创建索引时提供根mappings对象,并且在使用_mapping端点时不需要它,这就是put_mapping工作和create没有工作的原因。您可以在api

中看到
mapping = ''' 
{
    "mappings": {
        "test": {
            "properties": {
                "DocumentID": {
                    "type": "string"
                },
                "Tags": {
                    "type": "string",
                    "index": "not_analyzed"
                }
            }
        }
    }
}
'''

现在这将按预期工作

es.indices.create(index=indexName, body=mapping)

希望这有帮助

答案 1 :(得分:0)

我能够通过

获得正确的映射
es.indices.create(index=indexName)
es.indices.put_mapping(docType, mapping, indexName)

我不明白为什么

es.indices.create(index=indexName, body=mapping)

没用。这应该按照API工作。