0

次のスクリプトを使用して、ドキュメントを取得するサーバー側のランダムな順序を作成します。

curl -POST 'http://localhost:9200/my_index/my_type/_search' -d '
{
    "sort": {
        "_script": {
            "params": {},
            "type": "number",
            "order": "desc",
            "script": "Math.random()"
        }
    },
    "query": {
        "match_all": {}
    },
    "fields": [
        "field1",
        "field2"
    ]
}'

このスクリプトは、通常の検索を使用して正常に機能します。

しかし、これをスクロールしようとするとsearch_type=scan、何らかの理由でスコアを使用すると常に 0.0 のようで、元の挿入順序が取得されます。

私がフォローしている順序は、ドキュメントに従っています。まず、次のように呼び出します。

curl -POST 'http://localhost:9200/my_index/my_type/_search?pretty=true&search_type=scan&scroll=10m&size=4' -d '
    {
        "sort": {
            "_script": {
                "params": {},
                "type": "number",
                "order": "desc",
                "script": "Math.random()"
            }
        },
        "query": {
            "match_all": {}
        },
        "fields": [
            "field1",
            "field2"
        ]
    }'

その後:

curl -XGET 'http://localhost:9200/_search/scroll?pretty=true&scroll=10m&scroll_id=<the-previously-returned-id-here>

私は何を間違っていますか?

4

1 に答える 1

3

scanは、非常に大きな結果リストを取得するために最適化された特別な検索タイプです。このような最適化の結果、scan検索タイプはソートをサポートしません。したがって、あなたの場合、並べ替えパラメーターは単に無視されます。ソートされた結果を取得するには、ソートをサポートする他の検索タイプを使用する必要があります。デフォルトの検索タイプquery_then_fetchは、並べ替え値が結果リストのすべてのレコードのメモリに収まる限り機能します。使用の副作用query_then_fetchは、並べ替えが各ページで実行されるため、呼び出し間で一貫性を保つ必要があることです。

curl -POST 'http://localhost:9200/my_index/my_type/_search?pretty=true&scroll=10m&size=4' -d '
{
    "sort": {
        "_script": {
            "params": {},
            "type": "number",
            "order": "desc",
            "script": "(doc[\"_uid\"].value + salt).hashCode()",
            "params": {
                "salt": "some_random_string"
            }
        }
    },
    "query": {
        "match_all": {}
    },
    "fields": [
        "field1",
        "field2"
    ]
}'

最初のクエリの後、標準のスクロール リクエストを使用して結果をページングできます。

curl -XGET 'http://localhost:9200/_search/scroll?pretty=true&scroll=10m&scroll_id=<the-previously-returned-id-here>
于 2013-07-10T23:22:48.120 に答える