ElasticSearch-4 ayrı rastgele kaynaklı grup için Sorguları birleştirmek mi?

0

Soru

Elasticsearch'te oldukça yeniyim (biraz SQL deneyimi olsa da) ve şu anda uygun bir sorguyu bir araya getirmekle uğraşıyorum. 2 boole alanım var isPlayer ve isEvil bu bir giriş ya da true veya false üzerinde. Buna dayanarak, veri kümemi 4 gruba ayırmak istiyorum:

  1. ısPlayer: doğru, ısEvil: doğru
  2. ısPlayer: doğru, ısEvil: yanlış
  3. ısPlayer: false, ısEvil: true
  4. ısPlayer: yanlış, ısEvil: yanlış

Bu grupları kendi içlerinde rastgele sıralamak istiyorum, sonra bunları sayfalayabileceğim uzun bir listeye ekleyeceğim. Bunu sorgunun içinde yapmak istiyorum, çünkü SQL'DE benzer şekilde yapacağım için bunu yapmanın "doğru" yolu gibi görünüyor. Bu listede, gruplar sırayla sıralanmalıdır, bu nedenle önce Grup 1'in tüm girişleri rastgele bir sırayla, ardından Grup 2'nin tüm girişleri rastgele bir sırayla, ardından Grup 3'ün tüm girişleri vb. . Eğer aynı girişi verildiğinde, eğer sıralama varsa dayanarak eğer sıralama rastgele tekrarlanabilir elzemdir random_score ideal olarak rastgelelik için bir tohum kullanıyor olurdum.

Tek bir sorgu oluşturabilirim, ancak 4'ü nasıl birleştirebilirim?

Şimdiye kadar bulduğum yaklaşımlar olarak Çoklu Arama ve Ayırma Max Sorgusu. Çoklu Arama, Sayfalandırmayı desteklemiyor gibi görünüyor. Disjunction Max Sorgusu ile ilgili olarak, ağaçlar için ormanı kaçırıyor olabilirim, ancak orada alt sorguların birbirlerine eklemeden önce yalnızca kendi içlerinde rastgele sıralanması konusunda mücadele ediyorum.

Şu an için tek bir sorguyu nasıl yazıyorum Disjunction Max Query, yardımcı olması durumunda:

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

En iyi cevabı

0

Bu sorunun çözümü 4 ayrı grup yapmak değil, hepsinin farklı puan aralıklarına sahip olmasını sağlamak ve puanlara göre sıralamaktır. Bu, isabetleri bir tür eşleme ölçütüyle değil, bir komut dosyası puanı alanıyla puanlayarak başarılabilir. Bu alan, bir mantık puanı döndüren kodu kendiniz yazmanıza izin verir (Varsayılan dile "ağrısız" denir, ancak ben de harika örnekler gördüm).

Mantık oldukça basittir:

  1. ısPlayer = true ise, puana 2 puan ekleyin
  2. ısEvil = true ise, puana 4 puan ekleyin
  3. Her iki durumda da, sondaki puana 0 ile 1 arasında rastgele bir sayı ekleyin

Bu, farklı puan aralıklarıyla istediğim 4 grubu oluşturur:

  1. ısPlayer = true, ısEvil = true -- > Skor aralığı: 6-7
  2. ısPlayer = false, ısEvil = true -- > Skor aralığı: 4-5
  3. ısPlayer = doğru, ısEvil = yanlış - > Skor aralığı: 2-3
  4. ısPlayer = false, ısEvil = false -- > Skor aralığı: 0-1

Sorgu şöyle görünür:

  "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

Diğer dillerde

Bu sayfa diğer dillerde

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