【问题标题】:Elasticsearch: how to know which field the results are sorted by?Elasticsearch:如何知道结果是按哪个字段排序的?
【发布时间】:2017-11-12 20:08:34
【问题描述】:

在 Elasticsearch 中,有没有办法检查结果是按哪个字段排序的?我想要排序子句的内部命中之类的东西。

想象一下您的文档有这种形式:

{"numerals" : [  // nested
    {"key": "point", "value": 30},
    {"key": "points", "value": 200},
    {"key": "score", "value": 20},
    {"key": "scores", "value": 40}
  ]
}

然后您按以下方式对结果进行排序:

{"numerals.value": {
  "nested_path": "numerals",
  "nested_filter": {
    "match": {
      "numerals.key": "score"}}}}

现在我不知道如何知道实际排序结果的字段:在本文档中可能是scores,但在其他文档中可能是score?有 2 个问题 - 1. 您不能对嵌套字段使用内部点击或突出显示。 - 2.即使可以,但如果有多个匹配的候选人,它也不能解决问题。

【问题讨论】:

  • 如果您在嵌套过滤器中使用term 查询会怎样?
  • @Val 好吧,我想用match。
  • 很公平,为什么你有score 和scores?为什么不简单地使用相同的术语?
  • @Val 显示的文档只是一个妥协的例子。真实的要复杂得多。我什至无法期待keys 会发生什么。
  • 很公平,我只是想先看看是否有一个简单的方法;-)

标签: elasticsearch elasticsearch-5


【解决方案1】:

问题是关于按嵌套对象内的字段排序。

所以这就是文档的内容 https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-sorting.html 和 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-sort.html#_nested_sorting_example 说:

Elasticsearch 将首先通过“nested_filter”查询限制嵌套文档,然后按照与多值字段相同的方式进行排序: 就像只有过滤的嵌套文档作为内部对象一样,也就是好像只有根文档具有多值字段,其中包含属于过滤嵌套对象的所有值
(在您的示例中,将只剩下一个值:20)。 如果您想确定排序顺序,请插入“模式”参数: “min”、“max”、“sum”、“avg”或“median”

如果您没有根据corresponding issue指定“mode”参数,则将为“asc”选择最小值,为“desc”-order选择最大值:

默认情况下,在对多值字段进行排序时,最低或最高 值将根据排序从字段值中选取 顺序。

【讨论】:

  • 很有趣,但我怎么知道到底选择了哪个numerals.values 作为最小值和最大值的候选者?
  • 我更新了答案:因为您的nested_filter 仅在嵌套文档上匹配,所以剩余值为“20”。 “nested_filter”从弹性搜索中使用,独立于您的(主)查询。
猜你喜欢
  • 2018-07-09
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多