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提取所有内容,并在客户端对它们进行排序。我修正了答案。