服务器端随机不适用于滚动

时间:2013-07-10 14:31:58

标签: elasticsearch

我使用以下脚本创建检索文档的服务器端随机顺序:

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>

我做错了什么?

1 个答案:

答案 0 :(得分: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>