gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:43:54 26 4
gpt4 key购买 nike

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

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>

我究竟做错了什么?

最佳答案

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>

关于elasticsearch - 服务器端随机不适用于滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17573404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com