0

我正在尝试将一些这样的消息推送到 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()
4

2 回答 2

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)

希望这可以帮助

于 2016-02-02T01:07:10.763 回答
0

我能够得到正确的映射来工作

es.indices.create(index=indexName)
es.indices.put_mapping(docType, mapping, indexName)

我不明白为什么

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

不工作。这应该按照 API 工作。

于 2016-02-01T19:33:11.783 回答