ElasticSearch | 随机返回得分相同的结果

3
在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 */],
          }
        }
      }
    };

您可以使用重新评分(rescoring)来随机化前K个结果。 - Polynomial Proton
2个回答

1
亨利的回答很好,但我认为这样做更容易:
        function_score: {
          query: {
            ...
          },
          random_score: {
            seed: 12345678910,
            field: '_seq_no',
            weight: 0.0001
          },
          boost_mode: 'sum'

因此,没有必要提高原始分数,只需将随机分数降低权重,以便它对总分的贡献很小(但仍足以打破平局)。
虽然我不喜欢这种打破平局的方法,因为即使你只是对分数做出了微小的贡献,你仍然可能改变那些得分不同但非常接近的结果之间的顺序。这就是为什么我提出了这个功能请求

0
你可以使用function_score查询,在其中包装你的bool查询,并添加random_score函数。下一步是使用“boost”和“boost_mode”或“weight”找到适合你需求的好权重...
请注意,如果你使用过滤器,输出分数将为0,因此你需要将“boost_mode”从“multiply”更改为“replace”,“sum”或其他选项...
最后,不要忘记添加一个种子(以及ES 7.0的字段)到random_score中,以保持近乎一致的分页。
根据你的示例,我建议使用以下内容:
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'
        }
      }
    };


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接