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