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 回答