gpt4 book ai didi

elasticsearch - ElasticSearch随机分数与提升相结合?

转载 作者:行者123 更新时间:2023-12-02 22:13:24 25 4
gpt4 key购买 nike

我正在使用Firebase构建iOS应用,并使用ElasticSearch作为搜索引擎来获取更多高级查询。

我正在尝试建立一个可以基于查询从索引中获取随机记录的系统。我已经使用带有种子的“random_score”函数来完成此工作。

因此,所有文档现在都应具有相同的被选择机会。是否可以添加增强功能(对不起,我是ES新手)?

假设文档具有字段“boost_enabled”并将其设置为true,则文档被选择的可能性将增加3倍,因此“增加”被随机选择的机会吗?

因此,从理论上讲,它应如下所示:

符合查询条件的文件:

"document1"
"document2"
"document3"

他们都有平等的机会被选中(33%)

我希望实现的是如果“document1”具有字段“boost_enabled” = true

它看起来应该像这样:
"document1"
"document1"
"document1"
"document2"
"document3"

因此,现在选择“document1”作为随机记录的可能性要高3倍。

非常感谢您的帮助。

编辑:

我想出了类似的东西,对吗?我很确定那不是...
"query" : {
"function_score": {
"query": {
"bool" : {
"must": {
"match_all": {}
},
"should": [
{ "exists" : {
"field" : "boost_enabled",
"boost" : 3
}
}
]
"filter" : filterArray
}
},

"functions": [
{
"random_score": {"seed": seed}
}
]
}
}

/疯子

最佳答案

是的,Elasticsearch有类似的东西-请参阅Elasticsearch: Query-Time Boosting

在您的情况下,您的查询中有一部分会记录您所描述的标志的存在,并且此“子查询”将得到增强。带有bool子句的should可能会有用。

注意:这并不完全像说匹配文件是n倍的结果

编辑:

-

编辑1:

Elasticsearch会通过
Explain API在调整参数时可能会有所帮助。

-

编辑2:

对于上述内容,我深表歉意。经过进一步的思考和探索,我认为boost参数并不是这里所需要的。 function_score已经有了权重的概念,但即使这样也不够。我发现其他用户的需求与您的需求相似,但是似乎没有针对此提出任何好的解决方案。

引用文献:

  • Elasticsearch Github Issue on Weighted Random Sampling
  • Stackoverflow Post with a Request Identical to Github Issue

  • 我认为这些职位提出的解决方案是不正确的。我整理了一个快速的shell脚本,命中了Elasticsearch REST API,并依靠 jq(用于处理JSON的流行CLI)来演示: Github Gist: Flawed Attempt At Weighed Random Sampling with Elasticsearch

    在脚本中, featured_flag等同于您的 boost_enabled,并且 undesired_flag在那里演示了如何仅考虑索引中文档的子集。您可以将脚本调整全局变量复制到脚本顶部,例如Elasticsearch服务器,索引等,以进行尝试。
    有关脚本的一些注意事项:
  • 脚本创建一个启用了featured_flag的文档和一个启用了undesired_flag的文档,这些文档永远都不要选择
  • TOTAL_DOCUMENTS可用于调整创建的文档总数(包括创建的前两个文档)
  • FEATURED_FLAG_WEIGHT是在查询时通过function_score施加的权重
  • 脚本重新运行相同的查询1000次,并输出关于每个创建的文档作为第一个结果
  • 返回的次数的统计信息

    我想您的索引中有许多没有“特征”或“增强”样本。根据上述要求,选择样本的概率取决于文档的权重(假设增强文档为3,其余文档为1)以及要考虑的所有有效文档的权重之和。因此,简单的权重,提升和随机性似乎不足

    许多人已经考虑并发布了针对没有Elasticsearch的加权随机抽样任务的解决方案。这似乎是解释几种方法的好方法: electric monk: Weighted Random Distribution。许多算法细节在这里可能不太相关,但我认为它们很有趣。

    我认为理想的解决方案将需要在Elasticsearch之外完成工作(无需深入研究创建Elasticsearch插件,计分器等)。这是我目前能想到的最好的方法:
  • 文档中存储的数字权重字段(可以继续使用 bool(boolean) 字段,但这似乎更灵活)
  • 通过使用我们需要的某些统计数据的聚合来使用初始查询命中Elasticsearch
  • 可能是sum aggregation,用于文档概率
  • 所需的权重之和
  • 用来按权重获取文档计数的terms aggregation(例如:权重为1的m文档,权重为3的n文档)
  • 在Elasticsearch之外(在应用程序中),选择示例
  • 生成一个随机数,范围为0到sum_of_weights -1
  • 使用聚合结果和生成的随机数来选择一个索引(请参阅Elasticsearch之外的加权随机抽样的算法解决方案),该索引的范围为0到total_valid_documents -1(称为selected_index)
  • 再次单击Elasticsearch,使用适当的过滤器仅考虑有效文档,每次运行此过程时,sort参数可保证文档集的排序方式相同(可能按权重和文档ID排序),而from参数集到selected_index

  • 与所有这些稍有关系,我发布了一个略有不同的 write up

    关于elasticsearch - ElasticSearch随机分数与提升相结合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45164568/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com