elasticsearch,Random,Pagination,elasticsearch" /> elasticsearch,Random,Pagination,elasticsearch" />

Random 随机顺序&;分页弹性搜索

Random 随机顺序&;分页弹性搜索,random,pagination,elasticsearch,Random,Pagination,elasticsearch,在 是具有可选种子的订购功能请求,允许重新创建随机订单 我需要能够分页随机排序的结果。 如何使用Elasticsearch 0.19.1实现这一点 谢谢。您可以使用唯一字段(例如id)的哈希函数和随机salt进行排序。根据结果的真实随机性,您可以执行以下基本操作: { "query" : { "query_string" : {"query" : "*:*"} }, "sort" : { "_script" : { "script" : "(doc['_id']

在 是具有可选种子的订购功能请求,允许重新创建随机订单

我需要能够分页随机排序的结果。 如何使用Elasticsearch 0.19.1实现这一点


谢谢。

您可以使用唯一字段(例如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);