Elasticsearch:过滤符合条件的字段

时间:2020-05-11 14:56:42

标签: elasticsearch elasticsearch-dsl

我正在使用Elasticsearch 6.8.8。索引的映射非常复杂,因此出于说明目的将对其进行简化。假设我有一个公司的索引,这些公司的物业中都有雇员:

{
  "mappings": {
    "properties": {
      "id" : {"type" : "integer"},
      "employee" : {
        "properties" : {
          "id" : {"type" : "integer"},
          "name" : {"type" : "text"},
          "age" : {"type" : "integer"}
        }
      }     
    }
  }
}

我要搜索的公司中至少有一名年龄在20至30岁之间的员工。 AND 的名字是“ Smith”。

我所做的查询(见下文)仅返回公司,该公司的雇员年龄在20到30岁之间,而另一名雇员名为Smith:他们可能不是同一位雇员。

GET company/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "employees.age": {
              "gte": 20,
              "lte": 30
            }
          }
        }
      ],
      "filter": {
        "term": {
          "employees.name": "Smith"
        }
      }
    }
  }
}

如何指定两个“过滤器”应应用于同一字段?

非常感谢!

1 个答案:

答案 0 :(得分:1)

首先,您需要将type nestedy结构(由于无法将let i: I let u: U i = { x: 1, y: 2 }; // <- error i = { y: 2, z: 3 }; // <- error i = { x: 1, y: 2, z: 3 }; u = { x: 1, y: 2 }; u = { y: 2, z: 3 }; u = { x: 1, y: 2, z: 3 }; 的类型从employee更改为employee object

nested

完成此操作并为所有数据重新编制索引后,您可以像这样简单地利用nested query

{
  "mappings": {
    "properties": {
      "id" : {"type" : "integer"},
      "employees" : {
        "type": "nested",                  <--- add this
        "properties" : {
          "id" : {"type" : "integer"},
          "name" : {"type" : "text"},
          "age" : {"type" : "integer"}
        }
      }     
    }
  }
}