2017-01-14 5 views
0

最近、AWS Elasticsearchサービス(Elasticsearch 1.5.2で使用)からElastic Cloud(現在Elasticsearch 5.1.2を使用)に移行しました。うれしかったですが、その変更に伴い、Elasticsearchと新しいAPIの新しいバージョンが登場しました。物事を要求する新しい方法を念頭に置いて奮闘する。以前は、「Elasticsearch Request Body」からコピー/ペーストすることは可能でしたが、いくつかのことを調整し、elasticsearch.Elasticsearch.search()を実行して、私が期待するものを得ることができました。KibanaからのElasticsearchリクエストをelasticsearch-dslに翻訳

ここに私のElasticsearchリクエストボディ(簡潔にするため、Kibanaは通常、挿入という異質なものの一部を削除)Kibanaからだ:それはように見えるので、

{ 
    "size": 500, 
    "sort": [ 
    { 
     "Time.ISO8601": { 
     "order": "desc", 
     "unmapped_type": "boolean" 
     } 
    } 
    ], 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "query_string": { 
      "query": "Message\\ ID: 2003", 
      "analyze_wildcard": true 
      } 
     }, 
     { 
      "range": { 
      "Time.ISO8601": { 
       "gte": 1484355455678, 
       "lte": 1484359055678, 
       "format": "epoch_millis" 
      } 
      } 
     } 
     ], 
     "must_not": [] 
    } 
    }, 
    "stored_fields": [ 
    "*" 
    ], 
    "script_fields": {}, 
} 

は、今私は、それを行うにはelasticsearch-DSLを使用したいです(elasticsearch-pyを使用する代わりに)推奨される方法です。私は上記をelasticsearch-dslにどのように変換しますか?

は、ここで私がこれまで持っているものです。上記のように書かれて

from elasticsearch import Elasticsearch 
from elasticsearch_dsl import Search, Q 

client = Elasticsearch(
     hosts=['HASH.REGION.aws.found.io/elasticsearch'], 
     use_ssl=True, 
     port=443, 
     http_auth=('USER','PASS') 
    ) 

s = Search(using=client, index="emp*") 
s = s.query("query_string", query="Message\ ID:2003", analyze_wildcards=True) 
s = s.query("range", **{"Time.ISO8601": {"gte": 1484355455678, "lte": 1484359055678, "format": "epoch_millis"}}) 
s = s.sort("Time.ISO8601") 

response = s.execute() 

for hit in response: 
    print '%s %s' % (hit['Time']['ISO8601'], hit['Message ID']) 

私のコードは、私が期待するものを私に与えていません。 "Message \ ID:2003"と一致しないものを含む結果を取得する。また、要求されたTime.ISO8601の範囲外のものを与える。

elasticsearch-dslとES 5.1.2のやり方が全く新しいので、私はたくさんのことを学ぶことができます。私は間違って何をしていますか?助けを前にありがとう!

答えて

1

私はelasticsearchを現在実行していませんが、\符号をエスケープすることを除いて、クエリはあなたが望んでいるように見えます(s.to_dict()を見て生成されたクエリを見ることができます)。元のクエリでは、まだエスケープされていましたが、結果は異なるエスケープのために異なる可能性があります。

私は強くあなたのフィールドにスペースを有し、またquery_stringより構造化されたクエリを使用しないように助言wuld:

s = Search(using=client, index="emp*") 
s = s.filter("term", message_id=2003) 
s = s.query("range", Time__ISO8601={"gte": 1484355455678, "lte": 1484359055678, "format": "epoch_millis"}) 
s = s.sort("Time.ISO8601") 

注意私も若干の高速化のためにfilter()query()を変更し、__の代わりに使用していることfield nameキーワードの引数に.elasticsearch-dslは自動的にそれを.に展開します。

希望します。

関連する問題