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

涉及根值和嵌套值的Elasticsearch脚本查询

夔宏深
2023-03-14
问题内容

假设我有一个简化的Organization文档,其中包含嵌套的发布值,例如(ES 2.3):

{ 
  "organization" : { 
    "dateUpdated" : 1395211600000,

    "publications" : [ 
      { 
        "dateCreated" : 1393801200000
      },
      { 
        "dateCreated" : 1401055200000
      }
    ]
  }
}

我想查找所有发布日期为dateCreated <组织的dateUpdated的组织:

{
  "query": {
    "nested": {
      "path": "publications",
      "query": {
        "bool": {
          "filter": [
            {
              "script": {
                "script": "doc['publications.dateCreated'].value < doc['dateUpdated'].value"
              }
            }
          ]
        }
      }
    }
  }
}

我的问题是,当我执行嵌套查询时,该嵌套查询无权访问根文档值,因此doc['dateUpdated'].value无效并且获得0次匹配。

有没有一种方法可以将值传递给嵌套查询?还是我的嵌套方法完全不在这里?如果有必要,我想避免为出版物创建单独的文档。

谢谢。


问题答案:

您不能从嵌套查询上下文访问根值。它们被索引为单独的文档。从文档中

嵌套子句“下移”到嵌套注释字段中。它 不再有权访问根文档中的字段,也 无法 访问任何其他嵌套文档中的字段。

您可以借助copy_to参数获得所需的结果。执行此操作的另一种方法是使用 include_in_parentinclude_in_root,
但将来可能会不建议使用它们,并且由于嵌套类型的每个字段都将包含在根文档中,因此还会增加索引大小,因此在这种情况下copy_to功能会更好。

这是一个样本索引

PUT nested_index
{
  "mappings": {
    "blogpost": {
      "properties": {
        "rootdate": {
          "type": "date"
        },
        "copy_of_nested_date": {
          "type": "date"
        },
        "comments": {
          "type": "nested",
          "properties": {
            "nested_date": {
              "type": "date",
              "copy_to": "copy_of_nested_date"
            }
          }
        }
      }
    }
  }
}

在这里, nested_date的 每个值 将被复制到 copy_of_nested_date,
因此copy_of_nested_date看起来类似于[1401055200000,1393801200000,1221542100000],然后您可以使用像这样的简单查询来获取结果。

{
  "query": {
    "bool": {
      "filter": [
        {
          "script": {
            "script": "doc['rootdate'].value < doc['copy_of_nested_date'].value"
          }
        }
      ]
    }
  }
}

您不必更改嵌套结构,但必须在添加到 发布dateCreated 之后重新 索引 文档copy_to __



 类似资料:
  • 有没有办法在嵌套查询中使用“script_fields”,将字段添加到返回的inner_hits?例: 我执行n个嵌套查询,向每个嵌套查询传递一组特定的参数。这个想法是让源脚本根据提供的参数为每个内部命中的重叠字段分配一个值。 看起来在同一嵌套路径上执行更多的嵌套查询,定义不同的inner_hits使 ES 去除inner_hits匹配项。例: 如果像这样运行更多的嵌套查询,我会得到正确的匹配项,

  • 问题内容: 我有一个存储在ElasticSearch中的文档,如下所示。_资源: 我可以使用脚本化的指标汇总 http://www.elasticsearch.org/guide/zh- CN/elasticsearch/reference/current/search-aggregations-metrics-scripted- metric- aggregation.html访问 文档中的字符

  • 以下是我的查询的简化版本: 希望有办法解决这个... 提前感谢你的帮助

  • 问题内容: 我想获得一个请求数据来构建这样的东西: 首先,我在Elasticsearch上进行映射,如下所示: 然后我添加对象,如下所示。在将许多属性。如果笔记本电脑有许多端口,则每个端口都是中的另一个阵列。 现在我想要这样的结果: 我接近解决问题(我下面的查询),但在第二级聚集我所有的值(例如,在“决议”我有,和)。我想有只,并具有其他关键值,对只,以及其他价值具有关键。 问题答案: 你需要改变

  • 问题内容: 给定以下索引,我如何在嵌套数组中选择适当的项目并访问其中的一个值?目的是在内的值中使用它。 我的查询按skill_id过滤,效果很好。然后,我希望能够 针对给定的skill_id 使用更高的分数来提高文档的分数 。 (<-这是关键)。 如何从中访问数组,在数组中找到’skill_id:100’项目,然后使用其值?在上述目前不工作(比分始终是0,而不管数据的,所以我想在正确的地方是不看。

  • 在这里给ElasticSearch的初学者排名。 我有一个客户列表,他们的订单作为一个嵌套字段。假设文档结构如下: 我想查询的是:在两个日期之间订购了一定数量的用户列表。我希望能够将它与例如生日的范围查询结合起来。 我已经到了这样的地步,我可以使用聚合来获得每个订户在两个日期之间的排序总和: 但是,我想限制查询部分返回的结果,以便更好地与所有其他过滤器混合。 我的第一个想法是使用一个脚本过滤器,并