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

Elasticsearch : es.index() changes the Mapping when message is pushed

我正在尝试将一些类似的消息推送到 elasticsearch

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

因此,每条消息都有一个 id 字段,它是一个字符串,以及一个 list 字段,其中包含一个字符串值列表

当我将它推入 elastic 并尝试在 kibana 中创建图表时,默认分析器启动并将我的 list 拆分为 space 字符。因此它打破了我的价值观。我试图为我的索引创建一个映射

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()

我能够通过

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

我不明白为什么

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

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

你们非常亲密。您需要在创建索引时提供根 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)

希望对您有所帮助