Yeg*_*eps 30 random pagination elasticsearch
在此问题 中,使用可选种子进行排序的功能请求允许重新创建随机顺序.
我需要能够对随机排序的结果进行分页.怎么可以用Elasticsearch 0.19.1完成?
谢谢.
Nar*_*man 61
这应该比上面的两个答案快得多,并支持播种:
curl -XGET 'localhost:9200/_search' -d '{
"query": {
"function_score" : {
"query" : { "match_all": {} },
"random_score" : {}
}
}
}';
Run Code Online (Sandbox Code Playgroud)
请参阅:https://github.com/elasticsearch/elasticsearch/issues/1170
imo*_*tov 34
您可以使用唯一字段(例如id)和随机盐的哈希函数进行排序.根据结果应该是多么随机,你可以做一些原始的事情:
{
"query" : { "query_string" : {"query" : "*:*"} },
"sort" : {
"_script" : {
"script" : "(doc['_id'].value + salt).hashCode()",
"type" : "number",
"params" : {
"salt" : "some_random_string"
},
"order" : "asc"
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者像精致的东西
{
"query" : { "query_string" : {"query" : "*:*"} },
"sort" : {
"_script" : {
"script" : "org.elasticsearch.common.Digest.md5Hex(doc['_id'].value + salt)",
"type" : "string",
"params" : {
"salt" : "some_random_string"
},
"order" : "asc"
}
}
}
Run Code Online (Sandbox Code Playgroud)
第二个例子会产生更多的随机结果,但速度会慢一些.
对于这种工作方法_id,必须存储该字段.否则,查询将失败NullPointerException.
小智 22
伊莫托夫的好解决方案.
这里有一些更简单的东西,你不需要依赖文档属性:
{
"query" : { "query_string" : {"query" : "*:*"} },
"sort" : {
"_script" : {
"script" : "Math.random()",
"type" : "number",
"params" : {},
"order" : "asc"
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想设置一个类似的范围:
{
"query" : { "query_string" : {"query" : "*:*"} },
"sort" : {
"_script" : {
"script" : "Math.random() * (myMax - myMin) + myMin",
"type" : "number",
"params" : {},
"order" : "asc"
}
}
}
Run Code Online (Sandbox Code Playgroud)
用适当的值替换max和min.