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