2012-04-11 100 views
3

我在我的Python應用程序中使用ElasticSearch並希望能夠創建代表查詢的可重用字典對象。這裏描述的JSON結構是http://pulkitsinghal.blogspot.co.uk/2012/02/how-to-use-elasticsearch-query-dsl.html,我使用PyES來查詢搜索服務器。通過PyES,我們可以傳遞一個dict對象,在發送到服務器之前進行json化。我想創建一個只有實際查詢條件發生變化的常見查詢庫,所以我認爲我會將子類dict,因此我可以通過構造函數傳遞查詢條件,例如,當字典得到json化時,我最終會像這樣:繼承python字典

{ 
    "fields": [ 
    "name", 
    "shortDescription", 
    "longDescription" 
    ], 
    "query": { 
    "query_string": { 
     "fields": [ 
     "name" 
     ], 
     "query": query_term, 
     "use_dis_max": true 
    } 
    } 
} 

我該怎麼做?是真的,只有實例成員通過__dict__得到返回,如果是的話,我必須在構造函數中設置這個數據結構?這是做這件事的最好方法,還是應該創建一個不擴展字典的類,並創建一個返回正確結構中的字典的方法?

答:

這似乎是工作使這次更「Python化」可以理解的罰款,有什麼建議! (是的,我知道有沒有文檔字符串)

class StandardQuery(object): 

     search_fields = ['meta_keywords', 'meta_description', \ 
         'fields.title.value', 'slug'] 
     return_fields = ['slug', 'fields.title.value'] 

     def __init__(self, query): 

      self.query = query 

     def to_dict(self): 

      output = dict() 

      output['fields'] = self.search_fields 
      output['query'] = {'query_string': {'fields': self.return_fields, \ 
               'query': self.query, 'use_dis_max': True}} 

      return output 
+0

你的'StandardQuery'類看起來很好。如果你想修改單個實例中的'search_fields'或'return_fields',那麼一定要重新綁定而不是改變列表:類屬性在這裏是完全合適的,但是當它們可變時你必須小心。 – Duncan 2012-04-11 10:17:35

回答

4

如果你不希望所有的正常dict行爲,那麼你絕對應該只創建一個單獨的類。然後,您可以給它一個to_dict()方法,或者更好,因爲您真的想要轉換爲json創建一個自定義json編碼器(如果需要解碼器)以與參數json.dumps()一起使用。

json.dump()json.dumps()可選參數default是一個可調用的是要麼返回對象的序列化版本或提高TypeError(獲取默認的行爲)。

+0

謝謝@Duncan,這就是我的想法。創建to_dict方法可能更簡單,而不是繼承JSONEncoder – 2012-04-11 08:45:59

+0

TBH我發現擴展JSONEncoder的接口非常笨重,並且它不支持我實際上想要做的擴展類型。 – 2012-04-11 08:50:36

+0

@Duncan,請參閱編輯 – 2012-04-11 09:06:08