当前位置: 首页 > 面试题库 >

Elasticsearch按数组中的单个嵌套文档键排序

衡建中
2023-03-14
问题内容

我有看起来像这样的文档(以下是两个示例):

{
    "id": 1234,
    "title": "the title",
    "body": "the body",
    "examples": [
        {
            "evidence_source": "friend",
            "source_score": 15
        },
        {
            "evidence_source": "parent",
            "source_score": 12
        }
    ]
}

{
    "id": 6346,
    "title": "new title",
    "body": "lots of content",
    "examples": [
        {
            "evidence_source": "friend",
            "source_score": 10
        },
        {
            "evidence_source": "parent",
            "source_score": 27
        },
        {
            "evidence_source": "child",
            "source_score": 4
        }
    ]
}

examples数组中子文档的格式将始终具有an
evidence_source和a,source_score但是这些子文档的数量将可变,每个子文档具有不同的evidence_source值。

我想知道是否可以根据source_score与特定值匹配的值之一对这种格式的文档进行排序evidence_source。我真的很想能够做到这一点:

  • 通过对文档进行排序source_score下降,其中相关evidence_sourcefriend。文档ids 的最终排序为1234,6346。
  • 通过对文档进行排序source_score下降,其中相关evidence_sourceparent。文档ids 的最终排序为6346,1234。

我做这样的事最接近的结果是1和2,但我不相信它们能达到我想要做的事情。

关于我可能如何处理的任何想法?我已经考虑过基于分别索引这些examples子文档的一些想法,但是我对Elasticsearch还是很陌生,所以我正在寻找一些有关如何以最直接的方式实现我的目标的建议(这可能是个空想)
…)

更新
:elasticsearch邮件列表上的帖子似乎表明这是不可能的,但是我想知道这里的其他人是否有任何不同的想法!


问题答案:

在0.90中,对基于嵌套文档内部字段进行排序的支持已添加到elasticsearch中:

https://github.com/elasticsearch/elasticsearch/issues/2662

按嵌套字段排序支持在已经存在的排序选项之上具有以下参数:

  • nested_path-定义要排序的嵌套对象。实际的排序字段必须是此嵌套对象内的直接字段。默认值为使用排序字段中最直接继承的嵌套对象。
    * nested_filter-过滤器应匹配嵌套路径内的内部对象,以便通过排序将其字段值考虑在内。常见的情况是在嵌套的过滤器或查询中重复查询/过滤器。默认情况下,no
    nested_filter 为活动状态。

给定您的示例数据,以下查询应为您提供帮助:

{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "examples.source_score": {
        "order": "desc",
        "nested_path": "examples",
        "nested_filter": {
          "term": {
            "examples.evidence_source": "friend"
          }
        }
      }
    }
  ]
}


 类似资料:
  • 问题内容: 我正在编写资产管理应用程序。它允许用户通过向资产添加html控件(例如文本字段,选择菜单等)来存储任意资产属性。然后,该属性的JSON表示成为存储在beddb中的资产JSON文档的一部分。资产在ouchdb中具有以下结构: 我不确定将属性放入数组是否是允许基于属性值搜索资产的最佳方法。将属性直接附加到资产作为属性会更好吗?我正在用Elasticsearch做实验。如果我尝试按原样存储文

  • 我是Elasticsearch的新手,如果我问的问题非常简单直接,我会道歉。 我使用以下学生教育细节的映射, 我的数据集中有近15000名学生。文件示例: 我的问题是,我正在尝试做一个简单的查询,以显示那些拥有“BE”学位的学生。但我希望目前拥有BE(工程学士)学位的学生的排名高于同样拥有硕士和博士学位的学生。 从我的例子中,如果我查询“BE”,学生3应该比学生2排名更高。我应该能够根据"endD

  • 问题内容: 我有以下ES内容,基本上是网站中包含嵌套商品的产品列表。 如何按站点详细信息的数量排序? tnx! 问题答案: 从问题的示例来看,它看起来像是单个文档,但是单个json文档不可能在同一级别具有相同名称的多个字段。 因此,假设每个字段代表一个不同的顶级文档

  • null 我也尝试使用scripted_field,但是脚本字段似乎是在最后一个阶段计算的,在查询过程中不可用。 我也有一个按照相同逻辑进行排序的方法(根据给定仓库中库存的总和对产品进行排序),它像一个魅力一样工作: 但我也找不到访问此排序值的方法:(

  • 问题内容: 我在基于所选嵌套文档中的值对文档进行排序时遇到问题。我正在使用这样的设置: 我要检索的是具有所选子代ID的文档,这些文档将按所选子代的大小进行排序。因此查询看起来像: 在此查询中,无论我输入“ order”字段(asc还是desc),返回的文档都是相同的顺序。可能是什么问题? 问题答案: 看起来您构建嵌套过滤器的方式不正确。您在这里列出的内容也不适合我。 但是当我替换这个: 有了这个:

  • 问题内容: 假设我有一个对象: 我想找到一个id为1的对象。是否有类似这样的功能?我可以使用Underscore的方法,但必须从顶部开始然后向下过滤。 问题答案: 递归是您的朋友。我更新了该函数以说明属性数组: