当前位置: 首页 > 面试题库 >

Elasticsearch中的加权随机抽样

包兴思
2023-03-14
问题内容

我需要从ElasticSearch指数获得了随机抽样,即发出查询检索从加权概率定索引一些文档Wj/ΣWi(这里Wj是行的权重j,并Wj/ΣWi在此查询所有文件的权重的总和)。

当前,我有以下查询:

GET products/_search?pretty=true

{"size":5,
  "query": {
    "function_score": {
      "query": {
        "bool":{
          "must": {
            "term":
              {"category_id": "5df3ab90-6e93-0133-7197-04383561729e"}
          }
        }
      },
      "functions":
        [{"random_score":{}}]
    }
  },
  "sort": [{"_score":{"order":"desc"}}]
}

它从选定类别中随机返回5个项目。每个项目都有一个字段weight。所以,我可能必须使用

"script_score": {
  "script": "weight = data['weight'].value / SUM; if (_score.doubleValue() > weight) {return 1;} else {return 0;}"
}

作为描述在这里。

我有以下问题:

  • 正确的方法是什么?
  • 我需要启用动态脚本吗?
  • 如何计算查询的总和?

非常感谢你的帮助!


问题答案:

万一它对任何人都有帮助,这就是我最近实施加权改组的方式。

在此示例中,我们对公司进行了洗牌。每个公司都有一个介于0到100之间的“
company_score”。通过这种简单的加权改组,得分为100的公司出现在首页的可能性是得分为20的公司的5倍。

json_body = {
    "sort": ["_score"],
    "query": {
        "function_score": {
            "query": main_query,  # put your main query here
            "functions": [
                {
                    "random_score": {},
                },
                {
                    "field_value_factor": {
                        "field": "company_score",
                        "modifier": "none",
                        "missing": 0,
                    }
                }
            ],
            # How to combine the result of the two functions 'random_score' and 'field_value_factor'.
            # This way, on average the combined _score of a company having score 100 will be 5 times as much
            # as the combined _score of a company having score 20, and thus will be 5 times more likely
            # to appear on first page.
            "score_mode": "multiply",
            # How to combine the result of function_score with the original _score from the query.
            # We overwrite it as our combined _score (random x company_score) is all we need.
            "boost_mode": "replace",
        }
    }
}


 类似资料:
  • 问题内容: 在Java中,给定 n个 项目,每个项目的权重为 w ,一个人如何从集合中选择机会等于 w 的随机项目? 假设每个权重是0.0到1.0的两倍,并且集合中的权重之和为1。Item.getWeight()返回Item的权重。 问题答案: Item[] items = …;

  • 假设我得到的是范围内的随机数,使用: 假设它给出的数字小于或等于25,你就赢了,如果它给出的数字大于25,我就赢了。然后我有75%的机会赢。 我该如何加权这个数字大于25的概率的某个百分比,比如说1%。 所以,基本上,我试图将我获胜的几率再提高1%,而不是仅仅说“你赢24分或更少” 如果不清楚,请告诉我。

  • 问题内容: 我想从集合中选择一个随机项目,但是选择任何项目的机会应与相关的权重成比例 输入示例: 因此,如果我有4种可能的物品,那么没有重量的任何一件物品的机会将是四分之一。 在这种情况下,用户遭受痛苦之剑的可能性应该是三刃剑的十倍。 如何在Java中进行加权随机选择? 问题答案: Apache Commons中现在有一个用于此的类: 这里是,像(假设Item接口阿恩的答案): 或在Java 8中

  • 问题内容: 我正在尝试设计一种(好的)方法,从可能的数字范围中选择一个随机数,其中该范围内的每个数字都具有权重。简单地说:给定数字范围(0,1,2),请选择一个数字,其中0的概率为80%,1的概率为10%,2的概率为10%。 自从我的大学统计课程上课以来已经有8年了,所以您可以想象一下,目前适合我的方法并不适合我。 这是我想出的“便宜又肮脏”的方法。此解决方案使用ColdFusion。您可以使用任

  • 一个数组中有10个加权元素。我想随机选择一个元素N次,然后计算每个元素出现的次数。是否有一种算法可以在不需要选择N次的情况下为我提供元素计数<代码>N可能是一个很大的数字,在这种情况下,必须生成N个样本是低效的。 例如:一个盒子里有2个红色的球和8个白色的球。从盒子里随机挑选一个球,然后放回去,重复100次。计算拾取红色球或白色球的总次数。 我想知道是否有可能在不进行100次采样的情况下获得计数。

  • 问题内容: 允许从向量中进行加权选择,即 选择概率为0.2的1,概率为0.5的2和概率为0.3的3。 如果我们想对每个行都是概率向量的2D数组(矩阵)以向量化的方式快速进行操作,该怎么办?也就是说,我们想要一个来自随机矩阵的选择向量吗?这是超级慢的方式: : 这篇文章表明,并且可能是一种潜在的方法,而且很快。但是虽然可以沿numpy数组的一个轴执行此操作,但是该函数一次只能在单个数组上运行。同样,