python代码无法创建正确的映射

时间:2015-12-09 06:51:23

标签: elasticsearch

以下curl命令按预期工作。它返回正确的映射,但python代码返回空白。

curl -X PUT localhost:9200/geotest/
curl -X PUT localhost:9200/geotest/geotest/_mapping -d '{
    "geotest": {
        "properties": {
            "location": {
                "type": "geo_point",
                "lat_lon": true,
                "geohash": true
            }
        }
    }
}'

curl -XGET localhost:9200/geotest/_mapping
{"geotest":{"mappings":{"geotest":{"properties":{"location":{"type":"geo_point","lat_lon":true,"geohash":true}}}}}}

我希望这个python代码与上面相同......

import elasticsearch
es = elasticsearch.Elasticsearch('http://some_site.com:9200/')

mymapping={"geotest":{"properties":{"location":{"type":"geo_point","lat_lon":True,"geohash":True}}}}

es.indices.delete(index = 'geotest')
es.indices.create(index = 'geotest', body = mymapping)

curl -XGET localhost:9200/geotest/_mapping
{"geotest":{"mappings":{}}}

为什么python代码不像curl那样创建正确的映射?

更新

使用put_mapping方法我无法创建维基百科内容索引。

import urllib2
myfile=urllib2.urlopen('https://en.wikipedia.org/w/api.php?action=cirrus-mapping-dump&format=json').read()

import ast
myfile1=ast.literal_eval(myfile)['content']['page']['properties']

import elasticsearch
es = elasticsearch.Elasticsearch('http://some_site.com:9200/')

es.indices.delete(index ='enwiki_todel')
es.indices.create(index ='enwiki_todel')
es.indices.put_mapping(index ='enwiki_todel', doc_type='page', body = myfile1)

更新2

我尝试仅使用ast模块保留内容。并且仍然得到映射器解析异常。

import urllib2
myfile=urllib2.urlopen('https://en.wikipedia.org/w/api.php?action=cirrus-mapping-dump&format=json').read()

import ast
myfile1=ast.literal_eval(myfile)['content']

import elasticsearch
es = elasticsearch.Elasticsearch('http://ec2-52-91-179-95.compute-1.amazonaws.com:9200/')


es.indices.delete(index ='enwiki_todel')
es.indices.create(index ='enwiki_todel')
es.indices.put_mapping(index ='enwiki_todel', doc_type='page', body = myfile1)

1 个答案:

答案 0 :(得分:2)

你几乎就在那里。如果要一次性创建具有映射的索引,则需要在"mappings": {}索引调用的正文中使用create结构。像这样:

import elasticsearch
es = elasticsearch.Elasticsearch('http://some_site.com:9200/')

mymapping={"mappings": {"geotest":{"properties":{"location":{"type":"geo_point","lat_lon":True,"geohash":True}}}}}
              ^
              |
 enclose your mapping in "mappings"

es.indices.delete(index = 'geotest')
es.indices.create(index = 'geotest', body = mymapping)

另一种解决方案是在调用create后使用put_mapping,并且您将能够使用您最初拥有的相同结构,即没有"mappings: {}结构。

import elasticsearch
es = elasticsearch.Elasticsearch('http://some_site.com:9200/')

mymapping={"geotest":{"properties":{"location":{"type":"geo_point","lat_lon":True,"geohash":True}}}}

es.indices.delete(index = 'geotest')
es.indices.create(index = 'geotest')
es.indices.put_mapping(index = 'geotest', body = mymapping)