微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Elasticsearch - 随机分页结果和搜索查询匹配高于特定阈值

如何解决Elasticsearch - 随机分页结果和搜索查询匹配高于特定阈值

我仍在学习 Elasticsearch,所以希望有人能引导我走向正确的方向或指出任何可能对此有所帮助的其他文档。

我想要做的是为给定的搜索查询提供随机分页结果,随机结果仅来自高于特定分数阈值的查询分数。换句话说,我试图实现一些随机性,但仍然保持一些相关性,并且随机结果中包含得分较低的命中。

我可以使用 Function Score Queryrandom_score 函数使其部分工作。但是,根据我对这种方法的理解,它本质上会忽略查询的分数,然后随机对所有结果重新评分,这并不是我正在寻找的。我想在给出新的随机分数之前从 查询匹配分数 设置一个阈值 - 即。仅返回原始查询分数为 5 或更高的命中的随机结果。

使用从官方 Elasticsearch 指南中找到的一些示例 here,我将解释我正在寻找的结果。

认行为(无随机结果)

为了设置示例,我将对地址字段进行简单的查询匹配。

{
  "query": { "match": { "address": "mill lane" } }
}

简化回复查询将返回按最佳匹配(最高分)排序的查询分数,您可以看到它是 9.5。这里没有什么新东西,因为这是认的 Elasticsearch 行为

{
  "hits": {
    "total": {
      "value": 19,"relation": "eq"
    },"max_score": 9.507477,"hits": [
      {
        "_id": "136","_score": 9.507477,"_source": {
          "address": "198 Mill Lane"
        }
      },{
        "_id": "970","_score": 5.4032025,"_source": {
          "address": "990 Mill Road"
        }
      },{
        "_id": "231","_score": 4.1042743,"_source": {
          "address": "308 Harbor Lane"
        }
      }
    ]
  }
}

我目前的尝试(随机结果和种子分页

函数分数查询 docs example 之后,我能够获得不同的随机结果,这些结果可以通过提供不同的种子进行更改和用于分页

{
    "query": {
        "function_score": {
            "query": {
                "match": {
                    "address": "mill lane"
                }
            },"random_score": {
                "seed": 11,"field": "_seq_no"
            }
        }
    }
}

简化回复查询主要工作并将返回结果并使用随机分数代替查询分数,从而产生随机顺序。但是,这可能包括不那么相关的命中,因为使用了计算出的随机分数并且认分数不发挥作用。

{
  "hits": {
    "total": {
      "value": 19,"max_score": 3.964658,"hits": [
      {
        "_id": "568","_score": 3.964658,"_source": {
          "address": "295 Whitty Lane"
        }
      },{
        "_id": "136","_score": 3.6966596,{
        "_id": "70","_score": 3.630383,"_source": {
          "address": "685 School Lane"
        }
      }
    ]
  }
}

预期结果(随机结果/分页,命中高于特定阈值)

理想情况下,我想弄清楚如何保持 random_score 函数随机化和分页,但只让响应包含高于某个阈值的命中(在给出随机分数之前)

例如,使用我的第一个示例,我只想为查询分数 5 或更高的命中返回随机结果。

如果没有随机的原始结果是这样的:

{
  "hits": {
    "total": {
      "value": 19,/* THE 4.1 score SHOULD NOT BE IN THE RANDOM RESULT */
      {
        "_id": "231","_source": {
          "address": "308 Harbor Lane"
        }
      }
    ]
  }
}

然后随机的预期结果将只包括查询匹配中高于 5 分阈值的随机结果。您可以在下面看到原始分数为 4.1 的值不会包含在输出中。

{
  "hits": {
    "total": {
      "value": 2,"hits": [
      {
        "_id": "970","_source": {
          "address": "198 Mill Lane"
        }
      }
    ]
  }
}

文档中还有关于使用 min_score 参数的说明,但我无法让它与随机函数一起使用。

认情况下,修改分数不会改变匹配的文档。 要排除不符合特定分数阈值的文档 min_score 参数可以设置为所需的分数阈值。

如果能提供有关如何实现此目标的其他文档或想法的任何线索,我将不胜感激。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。