ElasticSearch 随机得分与 boost 相结合?

2024-03-22

我正在使用 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 倍。

非常感谢一些帮助。

EDIT:

我想出了这样的东西,这是否正确?我很确定这不是...

"query" : {
        "function_score": {
            "query": {
                "bool" : {
                    "must": {
                        "match_all": {}
                    },
                    "should": [
                        { "exists" : {
                            "field" : "boost_enabled",
                            "boost" : 3
                            }
                        }
                    ]
                    "filter" : filterArray
                 }
            },

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

/ Mads


是的,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 插件、记分器等)。这是我目前能想到的最好的:

  • 存储在文档中的数字权重字段(可以继续使用布尔字段,但这似乎更灵活)

  • 通过初始查询访问 Elasticsearch,利用聚合来获取我们需要的一些统计数据

    • 可能是一个求和聚合 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-sum-aggregation.html文档概率所需的权重总和
    • A 术语聚合 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html按重量获取文档数量(例如:m权重为 1 的文档,n重量为 3) 的文件
  • Outside of Elasticsearch (in the app), choose the sample
    • 生成0到范围内的随机数sum_of_weights-1
    • 使用聚合结果和生成的随机数来选择一个索引(请参阅 Elasticsearch 之外的加权随机采样的算法解决方案),该索引的范围在 0 到total_valid_documents-1(称之为selected_index)
  • 使用适当的过滤器再次点击 Elasticsearch,仅考虑有效文档,sort参数保证每次运行此过程时文档集都以相同的方式排序(可能按权重和文档 ID 排序),以及from参数设置为selected_index

与这一切略有相关,我发布了略有不同的write up http://eemp.io/2017/07/29/weighted-random-sampling-in-elasticsearch/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ElasticSearch 随机得分与 boost 相结合? 的相关文章

  • 如何将2个匹配查询加入到elasticsearch的查询中?

    我想查询以下数据user id is 1 and name is John 写一个常用的SQL很容易 select from t where user id 1 and name John 但对我来说进行elasticsearch的查询并不
  • delphi中生成随机数

    我想在delphi中创建一个随机数并将其分配给文件作为文件名 我设法做到了这一点 但是当我单击按钮生成数字时 它总是以 0 开头 知道如何修复它 procedure TForm1 Button1Click Sender TObject va
  • 如何使用 Android Studio 2.1.3 从 Android 中的文本文件中获取随机行?

    我有一个 500 行的文本文件 我将此文本文件放置在 app src main assets 文件夹中 名称为 words txt 在此文件中 每一行都用换行符分隔 现在我需要从这个文本文件中获取随机行 在发布此内容之前 我访问了以下问题
  • 将 ElasticSearch SearchResponse 对象转换为 JsonObject

    我想将elasticsearch搜索结果转换为Json对象 我还没有找到任何直接转换的正确方法 SearchResponse response client prepareSearch index setExplain true execu
  • scipy.stats....rvs 和 numpy.random 随机抽取之间的区别

    看起来是否是相同的分布 从中抽取随机样本numpy random比这样做更快scipy stats rvs 我想知道是什么原因导致两者之间的速度差异 scipy stats uniform实际上使用了numpy 这里是stats中对应的函数
  • R:如何添加具有从矩阵的每一行中随机选择的值的列?

    我会先说我是一个 R 菜鸟 我认为这可能有一个简单的解决方案 但我正在努力寻找它 我有一个 2 列 1 000 行的矩阵 保持行固定 我想创建一个新变量 从两列中随机选择一个元素 例如制作一个简单的矩阵 matrix c 1 1 4 6 1
  • 弹性搜索文档计数

    我正在运行 2 2 版本的 Elastic 搜索 我已经创建了索引并加载了示例文档 我发现其中有些问题 当我给予 GET index type count 我得到了正确的答案 count 9998 shards total 5 succes
  • 为什么 int 数组的最大大小小于 Int32.MaxValue? [复制]

    这个问题在这里已经有答案了 虽然这篇文章说它应该有效 https stackoverflow com questions 2338778 what is the maximum length of an array in net on 64
  • VBA rand 如何使用上限和下限生成随机数?

    所以也许这是多余的 也许这就像问为什么大多数人生来就有 5 个手指 最后的简短答案总是 因为事情就是这样 而且它就是这样工作的 但我讨厌这个答案 该死的我想知道怎么做VBA 中的 Rnd 函数有效 Ms Office Excel 的 MSD
  • 无法使用 java 8 在 Windows 10 上安装 elasticsearch 5.1.1

    我正在尝试在安装了 java 8 111 的 Windows 10 笔记本电脑上安装 ElasticSearch 5 1 1 当我尝试安装 Elastic search 时触发错误 C Users 用户名 Downloads elastic
  • 如何在 R 中创建循环来生成随机样本列表?

    我正在尝试创建一个循环来创建一系列包含随机样本的对象 如下所示 sample lt ceiling runif 9 min 0 max 20 这是圆形制服的示例 但它可以替换为普通 泊松或任何您想要的 因此 我构建了一个循环来自动生成各种生
  • Unity - 在生成时获取随机颜色

    我有一个小问题 我想在我的场景中生成四边形 它们都应该有红色或绿色作为材质 但 Random Range 函数只能是 int 我该如何解决它 void SpawningSquadsRnd rndColor 0 Color red rndCo
  • 弹性搜索 - search_after 参数

    我读了这个doc https www elastic co guide en elasticsearch reference 5 0 search request search after html要理解 search after 并有两个
  • search_after 在弹性搜索中如何工作?

    我一直在尝试在我们的应用程序中使用 Elasticsearch 但分页限制为 10k 对我们来说实际上是一个问题 并且由于必须超时问题 滚动 API 也不是推荐的选择 我发现 Elasticsearch 有一个叫做 search after
  • Elasticsearch 关于“空索引”的查询

    在我的应用程序中 我使用了几个elasticsearch索引 它们在初始状态下不包含索引文档 我认为这可以称为 空 该文档的映射是正确且有效的 该应用程序还有一个包含实体的关系数据库 这些实体可能具有在 elasticsearch 中关联的
  • 尝试在 ElasticSearch 中查询和聚合,但聚合不起作用 - elasticsearch.js 客户端

    我尝试查询我的数据集有两个目的 匹配一个术语 可转售 true 按价格对结果进行排序 最低到最高 数据集 文档是 data resellable true startingPrice 0 id 4emEe r x5DRCc5 buyNowP
  • 如何增加vm.max_map_count?

    我正在尝试在 Ubuntu EC2 计算机 t2 medium 中运行弹性搜索 但我收到消息 最大虚拟内存区域 vm max map count 65530 太低 至少增加到 262144 我怎样才能增加vm max map count v
  • ElasticSearch 映射对分组文档进行折叠/执行操作的结果

    有一个对话列表 每个对话都有一个消息列表 每条消息都有不同的字段和action场地 我们需要考虑到在对话的第一条消息中使用了动作A 在几条消息之后有使用的动作A 1过了一会儿A 1 1等等 有一个聊天机器人意图列表 对对话的消息操作进行分组
  • 在 C# 中生成随机浮点数的最佳方法[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在 C 中生成随机浮点数的最佳方法是什么 更新 我想要从 float Minvalue 到 float Maxvalue 的随机浮点数 我在一些
  • Elasticsearch:根据类型对不同字段进行排序

    我的索引中有两种类型 Event and City 我正在尝试按日期将它们全部排序 但是 每种类型的日期字段名称都不同 为了Event该值是在updated at领域和City日期是在update at其嵌套对象之一中的字段city eve

随机推荐