如何根据Elasticsearch中的rescore函数选择顶部术语存储桶

如何根据Elasticsearch中的rescore函数选择顶部术语存储桶,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,考虑Elasticsearch 5.6的以下查询: { "size": 0, "query": { "match_all": {} }, "rescore": [ { "window_size": 10000, "query": { "rescore_query": { "function_score": { "boost_mode": "replace",

考虑Elasticsearch 5.6的以下查询:

{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "rescore": [
    {
      "window_size": 10000,
      "query": {
        "rescore_query": {
          "function_score": {
            "boost_mode": "replace",
            "script_score": {
              "script": {
                "source": "doc['topic_score'].value"
              }
            }
          }
        },
        "query_weight": 0,
        "rescore_query_weight": 1
      }
    }
  ],
  "aggs": {
    "distinct": {
      "terms": {
        "field": "identical_id",
        "order": {
          "top_score": "desc"
        }
      },
      "aggs": {
        "best_unique_result": {
          "top_hits": {
            "size": 1
          }
        },
        "top_score": {
          "max": {
            "script": {
              "inline": "_score"
            }
          }
        }
      }
    }
  }
}
这是一个简化版本,其中实际查询有一个更复杂的主查询,而重新存储功能要密集得多

让我先解释一下它的用途,以防我要花1000个小时来开发一种在太空中写字的笔,而铅笔实际上可以解决我的问题。我正在执行一个快速的初始查询,然后用一个更密集的函数重新扫描顶部结果。从这些结果中,我想显示顶部不同的值,即没有两个结果应该具有相同的
相同的\u id
。如果有更好的方法来做这件事,我也会考虑这个问题。< /P> 我希望这样的查询会按重新存储查询对结果进行排序,对所有具有相同
相同\u id
的结果进行分组,并显示每个不同组的最热门结果。我还假设,由于我是按最大父级
\u分数
对这些术语聚合桶进行排序,因此它们的排序将反映从原始重新存储查询确定的它们所包含的最佳结果

事实上,术语bucket是按最大查询分数排序的,而不是按重新存储查询分数排序的。奇怪的是,桶内的顶部点击似乎确实使用了重新扫描

有没有更好的方法来实现我想要的最终结果,或者有什么方法可以修复此查询,使其以我期望的方式工作?

来自:

查询重新排序器仅对查询和后期筛选阶段返回的Top-K结果执行第二次查询。将在每个碎片上检查的文档数量可以由window_size参数控制,该参数默认为10

由于
rescore查询
post_filter
阶段之后启动,我假设术语聚合桶已经固定


我不知道如何将重新存储和聚合结合起来。对不起:(

我想我有一个很好的解决方案,但我会让悬赏继续到期,以防有人想出更好的办法

{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "sample": {
      "sampler": {
        "shard_size": 10000
      },
      "aggs": {
        "distinct": {
          "terms": {
            "field": "identical_id",
            "order": {
              "top_score": "desc"
            }
          },
          "aggs": {
            "best_unique_result": {
              "top_hits": {
                "size": 1,
                "sort": [
                  {
                    "_script": {
                      "type": "number",
                      "script": {
                        "source": "doc['topic_score'].value"
                      },
                      "order": "desc"
                    }
                  }
                ]
              }
            },
            "top_score": {
              "max": {
                "script": {
                  "source": "doc['topic_score'].value"
                }
              }
            }
          }
        }
      }
    }
  }
}

采样器
聚合将从核心查询中获取每个碎片的前N个命中数,并对这些命中数进行聚合。然后在定义存储桶顺序的最大聚合器中,我使用与从存储桶中拾取前N个命中数的脚本完全相同的脚本。现在存储桶和前N个命中数在相同的前N组项目和t上运行他将按相同脚本生成的相同分数的最大值排序桶。不幸的是,我仍然需要运行一次脚本来排序桶,并在桶中选择一个最热门的,您可以使用重新排序来代替最热门的排序,但无论哪种方式,它都必须运行两次,我发现它作为排序脚本比作为排序脚本更快重新存储

谢谢,在这一点上,我可能会尝试构建一个插件,从主查询中将排名前10K的结果作为ID,然后使用更密集的评分功能和聚合在这些ID上运行第二个查询。将其构建为插件可以减轻移动所有ID的一些开销。查看我的答案,我认为我找到了一个解决方案解决方案!以防万一,您是否尝试了使用字段值向量的函数分数查询?(请参见此处:)。您可以使用主查询筛选文档,然后使用函数分数查询获取自定义分数。我在示例中使用的脚本可以替换为函数分数/字段值向量。不过,这只是我真实查询的简化版本。我的真实查询使用插件,通过该插件的脚本是ac实际计算存储在每个文档上的高维向量之间的向量相似度。问题不在热门搜索中,因为这里已经解决了()。更重要的是术语聚合或最大值使用的是初始分数,而不是“top_分数”中的重排序分数这可能是一个技术限制、一个bug或一个愿望。请注意,在top hits聚合中,点击会突然按rescore hits排序!弹性搜索还提供了一个折叠功能()这以一种更具表现力的方式进行了区分。曾尝试使折叠功能与重新评分兼容,但它已被还原为低级问题(此处更多:)。请注意这一点。