elasticsearch Serverside random不适用于scroll,elasticsearch,elasticsearch" /> elasticsearch Serverside random不适用于scroll,elasticsearch,elasticsearch" />

elasticsearch Serverside random不适用于scroll

elasticsearch Serverside random不适用于scroll,elasticsearch,elasticsearch,我使用以下脚本创建检索文档的服务器端随机顺序: curl -POST 'http://localhost:9200/my_index/my_type/_search' -d ' { "sort": { "_script": { "params": {}, "type": "number", "order": "desc", "script": "Math.random()"

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

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\u 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>
curl-XGET'http://localhost:9200/_search/scroll?pretty=true&scroll=10m&scroll_id=

我做错了什么?

scan
是一种特殊的搜索类型,经过优化,可以获取非常大的结果列表。这种优化的结果是,
扫描
搜索类型不支持任何排序。因此,在您的情况下,排序参数被忽略。为了获得排序结果,您需要使用其他支持排序的搜索类型。默认的搜索类型
query\u then\u fetch
应该可以工作,只要排序值适合结果列表中所有记录的内存。使用
query\u then\u 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>
curl-XGET'http://localhost:9200/_search/scroll?pretty=true&scroll=10m&scroll_id=

扫描
是一种特殊的搜索类型,经过优化,可获取非常大的结果列表。这种优化的结果是,
扫描
搜索类型不支持任何排序。因此,在您的情况下,排序参数被忽略。为了获得排序结果,您需要使用其他支持排序的搜索类型。默认的搜索类型
query\u then\u fetch
应该可以工作,只要排序值适合结果列表中所有记录的内存。使用
query\u then\u 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>
curl-XGET'http://localhost:9200/_search/scroll?pretty=true&scroll=10m&scroll_id=

这会确定一次随机顺序,然后让我翻阅一遍吗?那么,如何使用“from”和“size”分页?我的数据库有10万条soms记录,因此
Math.Random
需要30秒来计算。我没有问题等待这30秒一次,但如果我必须这样做每一页…如果你想他们排序你将不得不等待排序每一页,不幸的是。否则,您可以使用scan提取所有内容,并在客户端对它们进行排序。我修正了答案。这会决定一次随机顺序,然后让我翻阅一遍吗?那么,如何使用“from”和“size”分页?我的数据库有10万条soms记录,因此
Math.Random
需要30秒来计算。我没有问题等待这30秒一次,但如果我必须这样做每一页…如果你想他们排序你将不得不等待排序每一页,不幸的是。否则,您可以使用scan提取所有内容,并在客户端对它们进行排序。我修正了答案。