3

PythonアプリケーションでElasticSearchを使用していて、クエリを表す再利用可能なディクショナリオブジェクトを作成できるようにしたいと考えています。JSON構造についてはhttp://pulkitsinghal.blogspot.co.uk/2012/02/how-to-use-elasticsearch-query-dsl.htmlで説明されており、PyESを使用して検索サーバーにクエリを実行しています。PyESを使用すると、サーバーに送信する前にjsonifiedされるdictオブジェクトを渡すことができます。実際のクエリ用語のみが変更される一般的なクエリのライブラリを作成したいので、たとえばコンストラクタを介してクエリ用語を渡すことができるようにdictをサブクラス化すると思いました。たとえば、dictがjsonifiedになると、次のようになります。このようなもの:

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

どうすればいいですか?インスタンスメンバーのみが経由で返されるというのは本当__dict__ですか?そうであれば、コンストラクターでこのデータ構造を設定する必要がありますか?これはこれを行うための最良の方法ですか、それともdictを拡張しないクラスを作成to_dict()し、正しい構造で辞書を返すメソッドを作成する必要がありますか?

答え:

これはうまく機能しているようです。これをより「pythonic」にするための提案をいただければ幸いです。(はい、ドキュメント文字列がないことはわかっています)

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
4

1 に答える 1

4

通常の動作をすべて望まない場合はdict、別のクラスを作成する必要があります。次に、to_dict()メソッドを指定するか、jsonに変換する必要があるため、のdefault引数で使用するカスタムjsonエンコーダー(および必要に応じてデコーダー)を作成することをお勧めしますjson.dumps()

json.dump()json.dumps()オプションの引数defaultは呼び出し可能であり、オブジェクトのシリアル化されたバージョンを返すか、TypeError(デフォルトの動作を取得するために)raiseする必要があります。

于 2012-04-11T08:25:34.030 に答える