42

我可以设置在 curl 命令中创建的索引的映射,如下所示:

{  
  "mappings":{  
    "logs_june":{  
      "_timestamp":{  
        "enabled":"true"
      },
      "properties":{  
        "logdate":{  
          "type":"date",
          "format":"dd/MM/yyy HH:mm:ss"
        }
      }
    }
  }
}

但是我需要在 python 中使用 elasticsearch 客户端创建该索引并设置映射.. 有什么办法?我在下面尝试了一些东西但没有用:

self.elastic_con = Elasticsearch([host], verify_certs=True)
self.elastic_con.indices.create(index="accesslog", ignore=400)
params = "{\"mappings\":{\"logs_june\":{\"_timestamp\": {\"enabled\": \"true\"},\"properties\":{\"logdate\":{\"type\":\"date\",\"format\":\"dd/MM/yyy HH:mm:ss\"}}}}}"
self.elastic_con.indices.put_mapping(index="accesslog",body=params)
4

4 回答 4

63

create您可以像这样在调用中简单地添加映射:

from elasticsearch import Elasticsearch

self.elastic_con = Elasticsearch([host], verify_certs=True)
mapping = '''
{  
  "mappings":{  
    "logs_june":{  
      "_timestamp":{  
        "enabled":"true"
      },
      "properties":{  
        "logdate":{  
          "type":"date",
          "format":"dd/MM/yyy HH:mm:ss"
        }
      }
    }
  }
}'''
self.elastic_con.indices.create(index='test-index', ignore=400, body=mapping)
于 2015-07-26T15:24:41.713 回答
32

好吧,有更简单的方法可以使用通用的 python 语法来做到这一点:

from elasticsearch import Elasticsearch
# conntect es
es = Elasticsearch([{'host': config.elastic_host, 'port': config.elastic_port}])
# delete index if exists
if es.indices.exists(config.elastic_urls_index):
    es.indices.delete(index=config.elastic_urls_index)
# index settings
settings = {
    "settings": {
        "number_of_shards": 1,
        "number_of_replicas": 0
    },
    "mappings": {
        "urls": {
            "properties": {
                "url": {
                    "type": "string"
                }
            }
        }
     }
}
# create index
es.indices.create(index=config.elastic_urls_index, ignore=400, body=settings)
于 2016-03-25T15:18:26.750 回答
19

Python API 客户端可能很难使用,它通常需要您将 JSON 规范文档的内部部分提供给关键字参数。

对于该put_mapping方法,您必须为其提供document_type参数并且仅提供“映射”文档的内部部分,而不是为其提供完整的“映射”JSON 文档,如下所示:

self.client.indices.put_mapping(
    index="accesslog",
    doc_type="logs_june",
    body={
        "_timestamp": {  
            "enabled":"true"
        },
        "properties": {  
            "logdate": {  
                "type":"date",
                "format":"dd/MM/yyy HH:mm:ss"
            }
        }
    }
)
于 2016-09-07T06:37:55.650 回答
0

如何通过创建索引提高字段限制的另一个 python 客户端示例

from elasticsearch import Elasticsearch

es = Elasticsearch([{'host': config.elastic_host, 'port': 
config.elastic_port}])
settings = {
    'settings': {
        'index.mapping.total_fields.limit': 100000
    }
}

es.indices.create(index='myindex', body=settings)
于 2017-09-11T18:16:09.933 回答