在python映射对象中排序json

时间:2013-10-09 07:33:41

标签: python json object mapping elasticsearch

我正在使用elasticsearch,其中查询将在json中发布,并且应该是标准顺序,否则结果将是错误的。问题是python正在改变我的json排序。我原来的json查询是。

x= {
  "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "*a*"
        }
      },
      "filter": {
        "and": {
          "filters": [
            {
              "term": {
                "city": "london"
              }
            },
            {
              "term": {
                "industry.industry_not_analyed": "oil"
              }
            }
          ]
        }
      }
    }
  },
  "facets": {
    "industry": {
      "terms": {
        "field": "industry.industry_not_analyed"
      }
    },
    "city": {
      "terms": {
        "field": "city.city_not_analyzed"
      }
    }
  }
}

但生成的python对象如下。

{
  'query': {
    'filtered': {
      'filter': {
        'and': {
          'filters': [
            {
              'term': {
                'city': 'london'
              }
            },
            {
              'term': {
                'industry.industry_not_analyed': 'oil'
              }
            }
          ]
        }
      },
      'query': {
        'query_string': {
          'query': '*a*'
        }
      }
    }
  },
  'facets': {
    'city': {
      'terms': {
        'field': 'city.city_not_analyzed'
      }
    },
    'industry': {
      'terms': {
        'field': 'industry.industry_not_analyed'
      }
    }
  }
}

结果与我需要的结果不同,如何解决这个问题。

1 个答案:

答案 0 :(得分:3)

使用OrderedDict()代替{}。请注意,您不能简单地使用OrderedDict(query=...),因为这会在后台创建无序的dict。请改用此代码:

x = OrderedDict()
x['query'] = OrderedDict()
...

我建议为此实现构建器:

x = Query().filtered().query_string("*a*").and()....