我使用以下脚本创建检索文档的服务器端随机顺序:
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>
我做错了什么?
答案 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>