【问题标题】:Get items whose maximal values of nested field less than a parameter value获取嵌套字段的最大值小于参数值的项
【发布时间】:2018-06-26 00:53:55
【问题描述】:

我在 elasticsearch 中有以下映射:

"mappings": {
  "company": {
    "properties": {
      "name": {
        "type": "keyword"
      },
      "employee": {
        "type": "object",
        "properties": {
          "age": {
            "type": "long"
          }
        }
      }
    }
  }
}

我想知道是否有可能获得所有员工年龄最大值小于 30 的公司。在 SQL 中,我只需要选择公司,同时通过公司 ID 加入员工和组,并创建一个 where 子句年龄小于 30 的最大值。

【问题讨论】:

  • 您是在 ES 中为每个员工创建一个文档,还是在员工字段中为每个具有多个员工的公司创建一个文档?
  • 我每个公司都有一份文件,有多名员工!

标签: elasticsearch spring-data-elasticsearch


【解决方案1】:

在您的情况下,这很容易。由于您永远不会得到重复公司的回复,因为您只有每个公司的文件,您可以直接搜索。示例:

GET yourindex/_search
{
  "query": {
    "bool": {
      "must_not": [
        {"range": {
          "employee.age": {
            "gt": 30
          }
        }}
      ]
    }
  }
}

值得注意的是,如果您想要进行结合员工字段的搜索,您可能会遇到问题。例如,如果您想搜索所有员工为age < 30 AND gender=MALE 的公司,此模型将失效。默认情况下,ElasticSearch 将所有字段视为独立的。这意味着该查询将返回至少有一名男性员工和一名 30 岁以下员工的任何公司。你无法说他们一定是同一个人。如果您需要执行这些类型的查询,则需要查看 nested 映射和查询,这会稍微改变上面的查询。

详情: https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html

【讨论】:

  • 我需要嵌套查询,但您的推荐对我帮助很大。所以我接受了答案!
  • 如果您需要嵌套查询,别忘了在索引任何数据之前,您还需要在映射中将字段标记为“嵌套”而不是“对象”
猜你喜欢
  • 2019-05-08
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多