ElasticSearch 查询基于数组中活动日期元素的文档
ElasticSearch query for documents based on active date element in array
我有一个 ElasticSearch 索引,其中的数据按我复制粘贴到底部的方式编入索引。
思路是它有文档,文档的"official name",在一个数组中。这是因为文件的官方名称有一段时间有效(即2014-2015年的名称是X,2016-2018年的是Y)。
我想要的是一个简单的查询,它根据 name
属性查找文档,但它在今天有效。
文档图:
"Company": {
"properties": {
"vatNumber": {
"type": "string"
},
"names": {
"type": "nested",
"include_in_parent": true,
"properties": {
"name": {
"type": "string"
},
"period": {
"properties": {
"validFrom": {
"type": "date",
"format": "dateOptionalTime"
},
"validTo": {
"type": "date",
"format": "dateOptionalTime"
}
}
},
"lastUpdated": {
"type": "date",
"format": "dateOptionalTime"
}
}
}}}
我的尝试:
我使用 NEST(.NET 客户端)。我假设总共有 2 个 "challenges":
- 我需要引用数组中的 属性 (
name
)
- 我需要
检查
validTo
确实是 null
(并忽略另一个
数组中的实体)
然而,经过搜索,我对这两个很迷茫!
您正在寻找的是嵌套查询,您可以在其中指定嵌套字段的路径(此处为 names.name 和 names.period.validTo)。要检查字段是否为空,您可以在 bool 查询的 must_not 子句中使用 exists 查询。这是一个示例
GET /_search
{
"query": {
"nested" : {
"path" : "names",
"query" : {
"bool" : {
"must":{
"term": {
"names.name": "Lars"
}
},
"must_not" :{
"exists": {
"field": "names.period.validTo"
}
}
}
}
}
}
}
我有一个 ElasticSearch 索引,其中的数据按我复制粘贴到底部的方式编入索引。
思路是它有文档,文档的"official name",在一个数组中。这是因为文件的官方名称有一段时间有效(即2014-2015年的名称是X,2016-2018年的是Y)。
我想要的是一个简单的查询,它根据 name
属性查找文档,但它在今天有效。
文档图:
"Company": {
"properties": {
"vatNumber": {
"type": "string"
},
"names": {
"type": "nested",
"include_in_parent": true,
"properties": {
"name": {
"type": "string"
},
"period": {
"properties": {
"validFrom": {
"type": "date",
"format": "dateOptionalTime"
},
"validTo": {
"type": "date",
"format": "dateOptionalTime"
}
}
},
"lastUpdated": {
"type": "date",
"format": "dateOptionalTime"
}
}
}}}
我的尝试:
我使用 NEST(.NET 客户端)。我假设总共有 2 个 "challenges":
- 我需要引用数组中的 属性 (
name
) - 我需要
检查
validTo
确实是null
(并忽略另一个 数组中的实体)
然而,经过搜索,我对这两个很迷茫!
您正在寻找的是嵌套查询,您可以在其中指定嵌套字段的路径(此处为 names.name 和 names.period.validTo)。要检查字段是否为空,您可以在 bool 查询的 must_not 子句中使用 exists 查询。这是一个示例
GET /_search
{
"query": {
"nested" : {
"path" : "names",
"query" : {
"bool" : {
"must":{
"term": {
"names.name": "Lars"
}
},
"must_not" :{
"exists": {
"field": "names.period.validTo"
}
}
}
}
}
}
}