Random 随机顺序&;分页弹性搜索
在 是具有可选种子的订购功能请求,允许重新创建随机订单 我需要能够分页随机排序的结果。 如何使用Elasticsearch 0.19.1实现这一点Random 随机顺序&;分页弹性搜索,random,pagination,
elasticsearch,Random,Pagination,
elasticsearch,在 是具有可选种子的订购功能请求,允许重新创建随机订单 我需要能够分页随机排序的结果。 如何使用Elasticsearch 0.19.1实现这一点 谢谢。您可以使用唯一字段(例如id)的哈希函数和随机salt进行排序。根据结果的真实随机性,您可以执行以下基本操作: { "query" : { "query_string" : {"query" : "*:*"} }, "sort" : { "_script" : { "script" : "(doc['_id']
谢谢。您可以使用唯一字段(例如id)的哈希函数和随机salt进行排序。根据结果的真实随机性,您可以执行以下基本操作:
{
"query" : { "query_string" : {"query" : "*:*"} },
"sort" : {
"_script" : {
"script" : "(doc['_id'].value + salt).hashCode()",
"type" : "number",
"params" : {
"salt" : "some_random_string"
},
"order" : "asc"
}
}
}
或者像这样复杂的东西
{
"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"
}
}
}
第二个示例将产生更多的随机结果,但速度稍慢
要使此方法起作用,必须存储字段
\u id
。否则,查询将失败,出现NullPointerException
我最终解决的问题与伊莫托夫的建议略有不同。因为我有多个客户机,所以我不想在每个客户机上实现围绕salt字符串的逻辑
我已经有了模型的随机密钥。我也不需要每个请求的顺序都是随机的,所以我安排了一个任务,每天晚上更新随机密钥,然后在Elasticssearch中按该字段排序。来自imotov的好解决方案 这里有一个更简单的方法,您不需要依赖文档属性:
{
"query" : { "query_string" : {"query" : "*:*"} },
"sort" : {
"_script" : {
"script" : "Math.random()",
"type" : "number",
"params" : {},
"order" : "asc"
}
}
}
如果要设置一个类似以下内容的范围:
{
"query" : { "query_string" : {"query" : "*:*"} },
"sort" : {
"_script" : {
"script" : "Math.random() * (myMax - myMin) + myMin",
"type" : "number",
"params" : {},
"order" : "asc"
}
}
}
用正确的值替换最大值和最小值。这应该比上面的答案快得多,并且支持播种:
curl -XGET 'localhost:9200/_search' -d '{
"query": {
"function_score" : {
"query" : { "match_all": {} },
"random_score" : {}
}
}
}';
请看:好吧,我正在考虑这样做,上面所有的方法对于应该相对简单的东西来说似乎有点“太复杂”。因此,我想出了一个替代方案,该方案运行良好,无需“动脑筋” 我首先执行_count查询,然后将其与“Start”和rand(0,$count)组合 e、 g 上述示例的假设:
- 您正在运行PHP
- 您还使用了PHP客户端
但是您不需要使用PHP来实现这一点,这种方法可以用于任何示例 那么我会将字符串存储在客户机上吗?比如在饼干里?因此,当用户调用第2页时,相同的顺序被保留?salt字符串应该生成并存储在维护用户会话的层上。它可以是存储用户查询或当前显示的页码的同一位置。它也可以是cookie。这是一个很好的通用解决方案。然而,最初的问题是要求“允许重新创建随机顺序的可选种子”。这就是所有复杂性的来源。是的,你完全正确。我的解决方案更适合标题“随机顺序和分页弹性搜索”。完全不能满足Yeggeps的需要。答案很好,但不幸的是,这也不能消除脚本排序的开销。。。在200多万份文档中,我们的查询仍然增加了>1份。每100份结果中,我会得到约10份副本(大小为20份)。如何消除重复?谢谢你的帮助。我想答案会更清楚,如果您更新示例查询,random_score支持种子设定。@MbRostami对于您必须添加的过滤器
“boost_mode”:“replace”,
,请参阅
JSONArray = array of json to send to ElasticSearch
$total_results = $ElasticSearchClient->count(JSONArray)
$start = rand(0, $total_results)
JSONArray['body']['from'] = $start;
$ElasticSearchClient->search(JSONArray);