2

rawes pythonバインディングを使用して、エラスティック検索クエリを日付でフィルタリングしようとしています。データベースを削除し、datetimeフィールドがdate_optional_timeであることを指定し、エラスティック検索データベースにいくつかの行を挿入し、フィールドの範囲フィルターdatetimeを使用してクエリを実行すると、結果が得られません (以下を参照)。私が間違っていることは何ですか?

>>> result = es.delete(root_url)
>>> result = es.put(root_url+"_mapping", data={
    "tweet": {
        "properties": {
            "datetime": {
                "type": "date", 
                "format": "date_optional_time"
            },
        }
    },
})
>>> result = es.post(root_url, data={
    "datetime": "2012-12-20 12:00:00",
    "name": "freddy",
    "text": "hello world",
})
>>> result = es.post(root_url, data={
    "datetime": "2012-11-20 12:00:00",
    "name": "julie",
    "text": "welcome to the wonderful world of cooking",
})
>>> result = es.get(root_url+"_search", data={
    "query": {
        "range": {  # expect this to return the one result on 2012-12-20
            "datetime": {
                "gte":"2012-12-01", # do not append "T00:00:00"; too slow!
                "lte":"2012-12-31", # do not append "T23:59:59"; too slow! 
            }
        }
    }
})
>>> pprint.pprint(result)
{u'_shards': {u'failed': 0, u'successful': 5, u'total': 5},
 u'hits': {u'hits': [], u'max_score': None, u'total': 0},
 u'timed_out': False,
 u'took': 4}
4

2 に答える 2

7

問題は明らかに、日付を文字列としてエンコードする方法にあります(文字列の「T」に注意してください)。これは機能します:

>>> result = es.post(root_url, data={
    "datetime": "2012-12-20T12:00:00",
    "name": "freddy",
    "text": "hello world",
})
>>> result = es.post(root_url, data={
    "datetime": "2012-11-20T12:00:00",
    "name": "julie",
    "text": "welcome to the wonderful world of cooking",
})
>>> result = es.get(root_url+"_search", data={
    "query": {
        "range": {  # expect this to return the one result on 2012-12-20
            "datetime": {
                "gte":"2012-12-01", 
                "lte":"2012-12-31",
            }
        }
    }
})
于 2012-12-21T16:50:24.813 に答える
1

get の代わりに post でリクエストを起動してみてください。pyes がどのように機能するかはわかりませんが、他のクライアントでは、POST の代わりに GET を使用するとペイロードが送信されません。

>>> result = es.post(root_url+"_search", data={
    "query": {
        "range": {  # expect this to return the one result on 2012-12-20
            "datetime": {
                "gte":"2012-12-01", 
                "lte":"2012-12-31",
            }
        }
    }
})

それは機能しますか?

于 2012-12-21T13:02:02.833 に答える