访问用户合并查询的4个独立的随机sourted群体?

0

的问题

我是相当新的以(虽然与公平的位SQL的经验),和我目前正在努力与把适当的查询在一起。 我有2个布尔的领域 isPlayerisEvil 这一条是 truefalse 上。 根据这一点,我要拆我的数据集成4个小组:

  1. isPlayer:真的,isEvil:true
  2. isPlayer:真的,isEvil:假
  3. isPlayer:假,isEvil:true
  4. isPlayer:假,isEvil:假

这些团体,我希望随机排序在自己,然后将它们连接是一个长长的清单,我可以分. 我想要做的内部查询,因为这似乎是"正确的"的方式来做到这一点,因为我会做同样在SQL。 在该列表中,集团将按顺序,从第一次所有条目的的第1组中的一个随机的顺序,那么所有条目的第2组中的一个随机的顺序,那么所有项目3的组等。 . 这是必要的,随机性的排序可重复的,如果给予同样的投入,因此,如果分类是根据 random_score 理想的是我会使用种子的随机性。

我可以建立一个单一的查询,但是我怎么把4吗?

作方法,我发现迄今为止 MultiSearch分离Max Query. MultiSearch看来似乎 不支持分页. 关于析取最大的查询这可能是我失去树木森林,但我苦苦挣扎在具有查询是随机排只能在自己之前添加他们到另一个。

在这里,我怎么写一个单一的查询,现在没有 Disjunction Max Query在这种情况下帮助:

{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "isPlayer": true
          }
        },
        {
          "term": {
            "isEvil": true
          }
        }
      ]
    }
  }
}
elasticsearch
2021-11-22 13:35:49
1

最好的答案

0

这个问题的解决方案是不这样做4个单独的团体,而是确保他们都有不同范围内的成绩和排序通过分。 这是可以实现的,通过分打不通过某种类型的匹配的标准,而是通过脚本,这是你的领域。 这一领域可以编写代码你自己返回的逻辑分(默认的语言是所谓的"痛苦",但我们看到的例子很帅)。

逻辑上是相当简单:

  1. 如果isPlayer=true,增加了2点的成绩
  2. 如果isEvil=true,加4点的分
  3. 无论哪种方式,添加一个随机的数量在0和1之间的分的末端

这创造了4个小组,我想与鲜明的分数范围内:

  1. isPlayer=true,isEvil=true-->分数范围:6-7
  2. isPlayer=false,isEvil=true-->分数范围:4-5
  3. isPlayer=true,isEvil=false-->分数范围:2-3
  4. isPlayer=false,isEvil=false-->分数范围:0-1

查询这样的:

  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": """
            double score = 0;
            if(doc['isPlayer']){
              score += 2;
            }
            
            if(doc['isEvil']){
              score += 4;
            }
            
            int partialSeed = 1;
            score += randomScore(partialSeed, 'id');
            return score;
        """
      }
    }
  }
}
2021-11-24 08:51:50

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................