我正在使用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"
}
}
}
}
}
如何指定两个“过滤器”应应用于同一字段?
非常感谢!
答案 0 :(得分:1)
首先,您需要将type nested
的y
结构(由于无法将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"}
}
}
}
}
}