簡體   English   中英

ElasticSearch | 將具有相同分數的結果隨機化

[英]ElasticSearch | Randomize results with same score

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

亨利的回答很好,但我認為這樣做更容易:

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

因此,無需提高原始分數,只需降低隨機分數的權重,使其貢獻很小(但仍足以打破平局)。

不過,我確實不喜歡這種打破平局的方法,因為即使你只對分數貢獻了一點點,你仍然可以在分數不同但分數非常接近的結果之間改變結果的順序。 這就是我打開此功能請求的原因。

您可以使用function_score查詢,將 bool 查詢包裝在其中並添加random_score function。下一步是使用“boost”和“boost_mode”或“weight”找到符合您需求的良好權重...

請注意,如果您使用過濾器,則output 分數將為 0 ,因此您需要將“boost_mode”從“乘法”更改為“替換”、“求和”或其他...

最后,不要忘記向 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'
        }
      }
    };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM