随机顺序和分页Elasticsearch

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.

  • 这是一个很好的通用解决方案.然而,最初的问题是要求"可选种子允许重建随机顺序".这就是所有复杂性的来源. (5认同)
  • 基本随机排序的优秀答案,谢谢 (3认同)