【问题标题】:Elasticsearch sort by single nested document key in arrayElasticsearch按数组中的单个嵌套文档键排序
【发布时间】:2013-05-23 21:59:47
【问题描述】:

我的文件看起来像这样(这里有两个例子):

{
    "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 数组中的子文档的格式总是有一个evidence_source 和一个source_score,但是这些子文档的数量是可变的,每个都有不同的evidence_source 值。

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

  • source_score 降序对文档进行排序,其中相关的evidence_sourcefriend。文档 ids 的结果排序将是 1234,6346。
  • source_score 降序对文档进行排序,其中相关的evidence_sourceparent。文档ids 的结果排序将是 6346,1234。

我为执行此类操作得出的最接近结果是 12,但我不相信它们完全符合我的要求。

有什么想法可以解决这个问题吗?我已经考虑了一些基于分别索引这些examples 子文档的想法,但我对弹性搜索相当陌生,所以我正在寻找一些关于如何以最直接的方式实现我的目标的建议(这可能是白日梦……)

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

【问题讨论】:

  • 子文档是映射为嵌套文档还是对象?您希望索引中有多少条记录?
  • 现在,我实际上并没有专门对它们进行映射,但我愿意尝试使用不同的映射来实现我正在寻找的功能。我预计总共存储了 1 亿条记录。
  • 您计划拥有多少种不同类型的 evidence_source?
  • 介于 5 到 10 之间,并不是每个文档都有完全相同的 evidence_source 块。
  • 我只是想这可能会更容易,如果您通过将证据类型移动到字段名称中来修改架构:“examples”:{“friend”:{“source_score”:10},“parent” : {"source_score": 27}, "child": {"source_score": 4}}

标签: elasticsearch


【解决方案1】:

在 0.90 中添加了对基于嵌套文档内的字段进行排序的支持:

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

通过嵌套字段支持排序有以下参数 现有排序选项的顶部:

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

根据您的示例数据,以下查询应该会为您提供您所追求的:

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

【讨论】:

  • 存在父子关系时是否可以使用上述查询?
  • @PrasadBhosale 这是不可能的,因为它仅适用于嵌套对象。 elastic.co/guide/en/elasticsearch/guide/current/…
  • 是否可以在嵌套过滤器中使用布尔查询?
  • @SvenMäurer - 这应该是可能的。您对bool 查询有任何问题吗?
猜你喜欢
  • 2013-01-08
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多