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

可以在ElasticSearch中对嵌套文档进行排序吗?

韶英达
2023-03-14
问题内容

可以说我有以下映射:

"site": {
  "properties": {
    "title":       { "type": "string" },
    "description": { "type": "string" },
    "category":    { "type": "string" },
    "tags":        { "type": "array" },
    "point":       { "type": "geo_point" }
    "localities":  { 
      type: 'nested',
      properties: {
        "title":       { "type": "string" },
        "description": { "type": "string" },
        "point":       { "type": "geo_point" }
      }
    }
  }
}

然后,我对父文档进行“ _geo_distance”排序,并能够对“ site.point”上的文档进行排序。但是,我还希望嵌套位置在父文档中按“
_geo_distance”排序。

这可能吗?如果是这样,怎么办?


问题答案:

不幸的是,没有(至少现在还没有)。

ElasticSearch中的查询仅标识与该查询匹配的文档以及它们的匹配程度。

要了解嵌套文档的用途,请考虑以下示例:

{
    "title":    "My post",
    "body":     "Text in my body...",
    "followers": [
        {
            "name":     "Joe",
            "status":   "active"
        },
        {
            "name":     "Mary",
            "status":   "pending"
        },
    ]
}

上面的JSON一旦在ES中建立索引,在功能上就等同于以下内容。注意该followers字段是如何展平的:

{
    "title":            "My post",
    "body":             "Text in my body...",
    "followers.name":   ["Joe","Mary"],
    "followers.status": ["active","pending"]
}

搜索:followers with status == active and name == Mary将与该文档匹配…不正确。

嵌套字段使我们可以解决此限制。如果该followers字段声明为类型nested而不是类型,object则其内容将在内部创建为单独的(不可见的)子文档。这意味着我们可以使用嵌套查询或嵌套过滤器将这些嵌套文档作为单独的文档进行查询。

但是,嵌套查询/过滤子句的输出仅告诉我们主要文档是否匹配以及匹配程度。它甚至没有告诉我们哪个嵌套文档匹配。为了弄清楚这一点,我们必须在应用程序中编写代码,以根据搜索条件检查每个嵌套文档。

有一些尚待解决的问题要求添加这些功能,但这并不是一个容易解决的问题。

实现所需目标的唯一方法是将子文档索引为单独的文档,并对其进行独立查询和排序。在主文档和这些单独的子文档之间建立父子关系可能会很有用。(请参阅父类型映射,索引api
docs
的父项和子项以及
top-children和has-
child查询。

此外,ES用户已将有关他们当前正在fork中使用的新has_parent过滤器的邮件通过邮件列表发送。但是,这在主要的ES库中尚不可用。



 类似资料:
  • 问题内容: 我正在使用以下映射: 文件范例: 我的问题是如何检索此文档并按“日期”对嵌套对象“注释”进行排序?结果: 问题答案: 您需要在inner_hits上对进行排序。这将为您提供所需的输出 我使用的源过滤得到的只有作为将被检索里面,但你能避免,如果你想 是5,因为默认值为3,并且在给定的示例中我们有4个对象。 希望这可以帮助!

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

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

  • 问题内容: 我有以下字典。 如何根据排序。因此,结果字典将如下所示。 问题答案: 从订购的项目元组列表构造一个: (假设Python 3,在Python 2中应该做同样的事情。)

  • 问题内容: 我正在尝试在Elasticsearch中进行嵌套排序,但到目前为止没有成功。 我的数据结构: 我想根据文档中第一作者的姓氏对文档进行排序。 使用的映射: 使用SearchRequestBuilder(JAVA)进行排序: 这行得通,但没有给出想要的结果(例如,首先是“叫卖”,然后是“罗杰”)。 我错过了什么吗?有没有办法表明Elasticsearch访问数组authorList的ind

  • 我试图在Elasticsearch中进行嵌套排序,但到目前为止还没有成功。 我的数据结构: 我想根据文档中第一作者的姓氏对文档进行排序。 使用SearchRequestBuilder(JAVA)进行排序: 这是有效的,但不能给出想要的结果(例如,首先是“霍金”,然后是“罗杰”)。 我是不是漏掉了什么?是否有一种方法可以指示Elasticsearch访问数组authorlist的index=0?是否