是的,Elasticsearch 有类似的东西 - 参考Elasticsearch:查询时间提升 https://www.elastic.co/guide/en/elasticsearch/guide/current/query-time-boosting.html.
在您的情况下,您的查询的一部分会注意到您所描述的标志的存在,并且此“子查询”将会有所提升。bool
以其should
条款可能会有用。
注意:这并不完全像说匹配文档是n
结果的可能性有几倍
EDITS:
--
EDIT 1:
Elasticsearch 会告诉您它是如何通过以下方式得出分数的解释API https://www.elastic.co/guide/en/elasticsearch/reference/current/search-explain.html这可能有助于调整参数。
--
EDIT 2:
我对我上面发布的内容表示歉意。经过进一步的思考和探索,我认为boost
参数并不完全是这里所需要的。function_score
已经有了重量的概念,但即使这样也还不够。我发现其他用户的要求与您类似,但似乎还没有为此提出任何好的解决方案。
参考:
- 关于加权随机采样的 Elasticsearch Github 问题 https://github.com/elastic/elasticsearch/issues/7783#issuecomment-64880008
- Stackoverflow 发布的请求与 Github 问题相同 https://stackoverflow.com/questions/34128770/weighted-random-sampling-in-elasticsearch
我认为这些帖子中提出的解决方案不太正确。我编写了一个快速的 shell 脚本,用于访问 Elasticsearch REST API 并依赖jq
(用于处理 JSON 的流行 CLI)来演示:Github 要点:使用 Elasticsearch 进行加权随机采样的错误尝试 https://gist.github.com/eemp/30421b784fc7f761c3e890b3dbd14d46
在剧本中,featured_flag
相当于你的boost_enabled
, and undesired_flag
是为了演示如何仅考虑索引中的文档子集。您可以复制脚本顶部的脚本调整全局变量(如 Elasticsearch 服务器、索引等)来尝试。
关于脚本的一些注释:
- 脚本创建一个文档
featured_flag
已启用且一份文档包含undesired_flag
启用不应该被选择的
-
TOTAL_DOCUMENTS
可用于调整创建的文档总数(包括前两个创建的文档)
-
FEATURED_FLAG_WEIGHT
是在查询时应用的权重function_score
- 脚本重新运行相同的查询 1000 次,并输出每个创建的文档作为第一个结果返回的次数的统计信息
我想你的索引有许多“特色”或“增强”样本,其中许多不是。根据所描述的要求,选择样本的概率取决于文档的权重(假设增强文档为 3,其余文档为 1)以及您想要考虑的所有有效文档的权重总和。因此,简单的权重、增强和随机似乎是不够的
许多人已经考虑并发布了在没有 Elasticsearch 的情况下进行加权随机采样任务的解决方案。这似乎很好地解释了一些方法:电僧:加权随机分布 https://www.electricmonk.nl/log/2009/12/23/weighted-random-distribution。许多算法细节可能与这里不太相关,但我认为它们很有趣。
我认为理想的解决方案需要在 Elasticsearch 之外完成工作(无需深入创建 Elasticsearch 插件、记分器等)。这是我目前能想到的最好的:
与这一切略有相关,我发布了略有不同的write up http://eemp.io/2017/07/29/weighted-random-sampling-in-elasticsearch/.