仅导入符合 Elastic Search 条件的数组
Import only arrays that match conditions in Elastic Search
我正在处理 ElasticSearch 中的嵌套嵌套数据。
我希望它像 RDBMS 中的 SELECT * 一样工作。
如果你有以下数据
POST test-stack/test/1234_5678
{
"Id" : 1234,
"availables":
[
{
"Id" : 4444,
"date" : "2019-09-10",
"time" : [
{
"dateTime" : "2019-09-10T09:30:00+09:00",
"Count" : 50
},
{
"dateTime" : "2019-09-10T10:00:00+09:00",
"Count" : 50
},
{
"dateTime" : "2019-09-10T10:30:00+09:00",
"Count" : 50
}
]
},
{
"Id" : 5555,
"date" : "2019-09-11",
"time" : [
{
"dateTime" : "2019-09-11T09:30:00+09:00",
"Count" : 50
},
{
"dateTime" : "2019-09-11T10:00:00+09:00",
"Count" : 50
},
{
"dateTime" : "2019-09-11T10:30:00+09:00",
"Count" : 50
}
]
},
{
"Id" : 6666,
"date" : "2019-09-12",
"time" : [
{
"dateTime" : "2019-09-12T09:30:00+09:00",
"Count" : 50
},
{
"dateTime" : "2019-09-12T10:00:00+09:00",
"Count" : 50
},
{
"dateTime" : "2019-09-12T10:30:00+09:00",
"Count" : 50
}
]
}
]
}
如果我这样做,
Select * 来自测试 t 其中 t.availables.date == '2019-09-10';
所以,我想得到这个答案,
"Id" : 4444,
"date" : "2019-09-10",
"time" : [
{
"dateTime" : "2019-09-10T09:30:00+09:00",
"Count" : 50
},
{
"dateTime" : "2019-09-10T10:00:00+09:00",
"Count" : 50
},
{
"dateTime" : "2019-09-10T10:30:00+09:00",
"Count" : 50
}
]
}
我是 Elastic Search 的初学者,我想知道这在 Elastic Search 中是否可行。
研究过无痛脚本还是不懂
您需要使用 nested query and inner hits。
嵌套查询将帮助您过滤嵌套字段,内部匹配将 return 匹配嵌套文档
映射:
PUT testindex11/_mapping
{
"properties": {
"Id": {
"type": "text"
},
"availables": {
"type": "nested",
"properties": {
"Id": {
"type": "text"
},
"date": {
"type": "date",
"format": "yyyy-MM-dd"
},
"time":{
"type": "nested",
"properties": {
"dateTime" :{
"type":"date",
"format":"yyyy-MM-dd'T'HH:mm:ss"
},
"count":{
"type":"integer"
}
}
}
}
}
}
}
查询:
GET testindex11/_search
{
"query": {
"nested": {
"path": "availables",
"query": {
"term": {
"availables.date": {
"value": "2019-09-10"
}
}
},
"inner_hits": {}
}
}
}
结果:
[
{
"_index" : "testindex11",
"_type" : "_doc",
"_id" : "PXuHQm0B4boMRQnoJOpR",
"_score" : 1.0,
"_source" : {
"Id" : 1234,
"availables" : [
{
"Id" : 4444,
"date" : "2019-09-10",
"time" : [
{
"dateTime" : "2019-09-10T09:30:00",
"Count" : 50
},
{
"dateTime" : "2019-09-10T10:00:00",
"Count" : 50
},
{
"dateTime" : "2019-09-10T10:30:00",
"Count" : 50
}
]
},
{
"Id" : 5555,
"date" : "2019-09-11",
"time" : [
{
"dateTime" : "2019-09-11T09:30:00",
"Count" : 50
},
{
"dateTime" : "2019-09-11T10:00:00",
"Count" : 50
},
{
"dateTime" : "2019-09-11T10:30:00",
"Count" : 50
}
]
},
{
"Id" : 6666,
"date" : "2019-09-12",
"time" : [
{
"dateTime" : "2019-09-12T09:30:00",
"Count" : 50
},
{
"dateTime" : "2019-09-12T10:00:00",
"Count" : 50
},
{
"dateTime" : "2019-09-12T10:30:00",
"Count" : 50
}
]
}
]
},
"inner_hits" : {
"availables" : {
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "testindex11",
"_type" : "_doc",
"_id" : "PXuHQm0B4boMRQnoJOpR",
"_nested" : {
"field" : "availables",
"offset" : 0
},
"_score" : 1.0,
"_source" : {
"Id" : 4444,
"date" : "2019-09-10",
"time" : [
{
"dateTime" : "2019-09-10T09:30:00",
"Count" : 50
},
{
"dateTime" : "2019-09-10T10:00:00",
"Count" : 50
},
{
"dateTime" : "2019-09-10T10:30:00",
"Count" : 50
}
]
}
}
]
}
}
}
}
]
我正在处理 ElasticSearch 中的嵌套嵌套数据。
我希望它像 RDBMS 中的 SELECT * 一样工作。
如果你有以下数据
POST test-stack/test/1234_5678
{
"Id" : 1234,
"availables":
[
{
"Id" : 4444,
"date" : "2019-09-10",
"time" : [
{
"dateTime" : "2019-09-10T09:30:00+09:00",
"Count" : 50
},
{
"dateTime" : "2019-09-10T10:00:00+09:00",
"Count" : 50
},
{
"dateTime" : "2019-09-10T10:30:00+09:00",
"Count" : 50
}
]
},
{
"Id" : 5555,
"date" : "2019-09-11",
"time" : [
{
"dateTime" : "2019-09-11T09:30:00+09:00",
"Count" : 50
},
{
"dateTime" : "2019-09-11T10:00:00+09:00",
"Count" : 50
},
{
"dateTime" : "2019-09-11T10:30:00+09:00",
"Count" : 50
}
]
},
{
"Id" : 6666,
"date" : "2019-09-12",
"time" : [
{
"dateTime" : "2019-09-12T09:30:00+09:00",
"Count" : 50
},
{
"dateTime" : "2019-09-12T10:00:00+09:00",
"Count" : 50
},
{
"dateTime" : "2019-09-12T10:30:00+09:00",
"Count" : 50
}
]
}
]
}
如果我这样做,
Select * 来自测试 t 其中 t.availables.date == '2019-09-10';
所以,我想得到这个答案,
"Id" : 4444,
"date" : "2019-09-10",
"time" : [
{
"dateTime" : "2019-09-10T09:30:00+09:00",
"Count" : 50
},
{
"dateTime" : "2019-09-10T10:00:00+09:00",
"Count" : 50
},
{
"dateTime" : "2019-09-10T10:30:00+09:00",
"Count" : 50
}
]
}
我是 Elastic Search 的初学者,我想知道这在 Elastic Search 中是否可行。
研究过无痛脚本还是不懂
您需要使用 nested query and inner hits。
嵌套查询将帮助您过滤嵌套字段,内部匹配将 return 匹配嵌套文档
映射:
PUT testindex11/_mapping
{
"properties": {
"Id": {
"type": "text"
},
"availables": {
"type": "nested",
"properties": {
"Id": {
"type": "text"
},
"date": {
"type": "date",
"format": "yyyy-MM-dd"
},
"time":{
"type": "nested",
"properties": {
"dateTime" :{
"type":"date",
"format":"yyyy-MM-dd'T'HH:mm:ss"
},
"count":{
"type":"integer"
}
}
}
}
}
}
}
查询:
GET testindex11/_search
{
"query": {
"nested": {
"path": "availables",
"query": {
"term": {
"availables.date": {
"value": "2019-09-10"
}
}
},
"inner_hits": {}
}
}
}
结果:
[
{
"_index" : "testindex11",
"_type" : "_doc",
"_id" : "PXuHQm0B4boMRQnoJOpR",
"_score" : 1.0,
"_source" : {
"Id" : 1234,
"availables" : [
{
"Id" : 4444,
"date" : "2019-09-10",
"time" : [
{
"dateTime" : "2019-09-10T09:30:00",
"Count" : 50
},
{
"dateTime" : "2019-09-10T10:00:00",
"Count" : 50
},
{
"dateTime" : "2019-09-10T10:30:00",
"Count" : 50
}
]
},
{
"Id" : 5555,
"date" : "2019-09-11",
"time" : [
{
"dateTime" : "2019-09-11T09:30:00",
"Count" : 50
},
{
"dateTime" : "2019-09-11T10:00:00",
"Count" : 50
},
{
"dateTime" : "2019-09-11T10:30:00",
"Count" : 50
}
]
},
{
"Id" : 6666,
"date" : "2019-09-12",
"time" : [
{
"dateTime" : "2019-09-12T09:30:00",
"Count" : 50
},
{
"dateTime" : "2019-09-12T10:00:00",
"Count" : 50
},
{
"dateTime" : "2019-09-12T10:30:00",
"Count" : 50
}
]
}
]
},
"inner_hits" : {
"availables" : {
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "testindex11",
"_type" : "_doc",
"_id" : "PXuHQm0B4boMRQnoJOpR",
"_nested" : {
"field" : "availables",
"offset" : 0
},
"_score" : 1.0,
"_source" : {
"Id" : 4444,
"date" : "2019-09-10",
"time" : [
{
"dateTime" : "2019-09-10T09:30:00",
"Count" : 50
},
{
"dateTime" : "2019-09-10T10:00:00",
"Count" : 50
},
{
"dateTime" : "2019-09-10T10:30:00",
"Count" : 50
}
]
}
}
]
}
}
}
}
]