ElasticSearch|将相同分数的结果随机化

evrscar2  于 2022-10-06  发布在  ElasticSearch
关注(0)|答案(2)|浏览(185)

在ElasticSearch中,是否有可能在不丢失分页的情况下将搜索结果的顺序随机化并获得相同的分数?

我正在主持一个数据库,里面有数以千计的求职者。当一家公司在搜索特定技能(或技能组合)时,顺序总是相同的(因此,位于搜索结果顶部的候选人具有巨大的优势)

搜索查询示例:

let params = {
      index: 'candidates',
      type: 'candidate',
      explain: true,
      size: size,
      from: from,
      body: {
        _source: {
          includes: ['firstName', 'middleName', 'lastName']
        },
        query: {
          bool: {
            must: [/* Left out */],
            should: [/* Left out */],
          }
        }
      }
    };
3htmauhk

3htmauhk1#

亨利的回答是好的,但我认为这样做更容易:

function_score: {
          query: {
            ...
          },
          random_score: {
            seed: 12345678910,
            field: '_seq_no',
            weight: 0.0001
          },
          boost_mode: 'sum'

因此,没有必要提高原始分数,只需将随机分数加权,使其贡献很小(但仍足以打破平局)。

我不喜欢这种打破平局的方法,因为即使你对分数贡献很小,你仍然可以改变不同分数但分数非常接近的结果之间的结果顺序。这就是我打开this feature request的原因。

qc6wkl3g

qc6wkl3g2#

您可以使用function_score查询,将bool查询 Package 在其中,然后添加一个RANDOM_SCORE函数。下一步是使用“BOOST”和“BOOST_MODE”或“Weight”找到符合您需求的好权重……

请注意,如果您使用筛选器,则输出分数将为0,因此您需要将“BOOST_MODE”从“MAXPLY”更改为“REPLACE”、“SUM”或其他值……

最后,不要忘了向RANDOM_SCORE添加种子(以及ES 7.0中的字段),以保持近乎一致的分页

从你的例子中,我建议这样做:

let params = {
      ...
      body: {
        ...
        function_score: {
          query: {
            bool: {
              must: [/* Left out */],
              should: [/* Left out */],
              boost: 100
            }
          },
          random_score: {
            seed: 12345678910,
            field: '_seq_no'
          },
          boost_mode: 'sum'
        }
      }
    };

相关问题