在单个 elasticsearch 查询中从 parent 和 child 获取多个字段数据
Get mutiple field data from both parent and child in a single elasticsearch query
是否可以在单个 elasticsearch 查询中同时从 parent 和 child 获取字段数据?本质上,我试图通过过滤在单次迭代中捕获多个 parent 字段和多个 child 字段的数据。我尝试了多种将信息绑定到单个查询中的方法,但无法从中找出一种方法。这是我的映射的样子:-
parent:
_id_parent : values {1}
_source: {_date (20160316), _time (20160316010000), _id_source (test), _year (2016), _month (1)}
child:
_id_child : values {1}
_source: {_id_child (1), _id_parent (1), _child_question (q1), _child_answer (This needs to be done.)}
预期输出(类似于下面的内容):
(PARENT)
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [ {
"_index" : "index",
"_type" : "parent",
"_id" : "1",
"_score" : 1.0,
"_source":{_id_parent":"1","_id_source":"test","_date":"20160316","_time":"20160316010000","_year":2016,"_month":"1"}
} ]
}
(CHILD)
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [ {
"_index" : "index",
"_type" : "child",
"_id" : "1",
"_score" : 1.0,
"_source":{"_id_child":"1", "_child_question":"q1","_child_answer":"This needs to be done."}
} ]
}
链接:
http://rore.im/posts/elasticsearch-joins/
https://github.com/elastic/elasticsearch/issues/761
https://www.elastic.co/guide/en/elasticsearch/guide/current/children-agg.html
curl -XGET "$ELASTICSEARCH_ENDPOINT/index/parent/_search?pretty=true" -d "
{
"query": {
"match": {
"_id_parent": "1"
}
},
"size" : 10,
"aggs": {
"_id_parent": {
"terms": {
"field":"_id_parent",
"field":"_id_source",
"field":"_date",
"field":"_time",
"field":"_year",
"field":"_month",
},
"aggs": {
"child": {
"children": {
"type": "child"
},
"aggs": {
"child": {
"terms": {
"field": "child._id_child",
"field": "child._child_question",
"field": "child._child_answer",
}
}
}
}
}
}
}
}"
这听起来像是 inner hits 的工作。此功能允许您获得 has_child
或 has_parent
匹配项。
在您的情况下,您将针对 parent 进行查询,并使用简单的 has_child
(即 match_all),反之亦然,例如
{
"query" : {
"has_child" : {
"type" : "child",
"query" : {
"match_all": {}
},
"inner_hits" : {}
}
}
}
我做了一些假设...让我知道它们是否正确
- 您需要来自父映射的文档 id = 1
- 您还需要 parent_id = 1
的所有子文档
- 您正在将此 parent_id 从您的代码传递到 elasticsearch。
- 您没有要求 elasticsearch 过滤多个父文档。在你点击 elasticsearch 之前,你已经知道你想要 id = 1
的父文档
如果是这种情况,您可以创建两个单独的查询
第一个查询是 "get parent doc with id = 1"
第二个查询是 "get all child docs with parent_id = 1"
并且您可以使用 Elasticsearch 的 "multisearch API" 在一个网络调用中将这两个请求发送到 elasticsearch
您可以使用以下示例从父索引和子索引进行搜索。希望这对您有所帮助。
GET indexname/_search
{
"query": {
"bool": {
"must": [
{
"bool": {
"must": [
{
"term": {
"parentField": {
"value": "valuetosearch"
}
}
}
]
}
},
{
"has_child": {
"type": "childindex",
"query": {
"range" : {
"childindexField" : {
"lte": "value"
}
}
}
}
}
]
}
}
}
是否可以在单个 elasticsearch 查询中同时从 parent 和 child 获取字段数据?本质上,我试图通过过滤在单次迭代中捕获多个 parent 字段和多个 child 字段的数据。我尝试了多种将信息绑定到单个查询中的方法,但无法从中找出一种方法。这是我的映射的样子:-
parent:
_id_parent : values {1}
_source: {_date (20160316), _time (20160316010000), _id_source (test), _year (2016), _month (1)}
child:
_id_child : values {1}
_source: {_id_child (1), _id_parent (1), _child_question (q1), _child_answer (This needs to be done.)}
预期输出(类似于下面的内容):
(PARENT)
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [ {
"_index" : "index",
"_type" : "parent",
"_id" : "1",
"_score" : 1.0,
"_source":{_id_parent":"1","_id_source":"test","_date":"20160316","_time":"20160316010000","_year":2016,"_month":"1"}
} ]
}
(CHILD)
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [ {
"_index" : "index",
"_type" : "child",
"_id" : "1",
"_score" : 1.0,
"_source":{"_id_child":"1", "_child_question":"q1","_child_answer":"This needs to be done."}
} ]
}
链接:
http://rore.im/posts/elasticsearch-joins/
https://github.com/elastic/elasticsearch/issues/761
https://www.elastic.co/guide/en/elasticsearch/guide/current/children-agg.html
curl -XGET "$ELASTICSEARCH_ENDPOINT/index/parent/_search?pretty=true" -d "
{
"query": {
"match": {
"_id_parent": "1"
}
},
"size" : 10,
"aggs": {
"_id_parent": {
"terms": {
"field":"_id_parent",
"field":"_id_source",
"field":"_date",
"field":"_time",
"field":"_year",
"field":"_month",
},
"aggs": {
"child": {
"children": {
"type": "child"
},
"aggs": {
"child": {
"terms": {
"field": "child._id_child",
"field": "child._child_question",
"field": "child._child_answer",
}
}
}
}
}
}
}
}"
这听起来像是 inner hits 的工作。此功能允许您获得 has_child
或 has_parent
匹配项。
在您的情况下,您将针对 parent 进行查询,并使用简单的 has_child
(即 match_all),反之亦然,例如
{
"query" : {
"has_child" : {
"type" : "child",
"query" : {
"match_all": {}
},
"inner_hits" : {}
}
}
}
我做了一些假设...让我知道它们是否正确
- 您需要来自父映射的文档 id = 1
- 您还需要 parent_id = 1 的所有子文档
- 您正在将此 parent_id 从您的代码传递到 elasticsearch。
- 您没有要求 elasticsearch 过滤多个父文档。在你点击 elasticsearch 之前,你已经知道你想要 id = 1 的父文档
如果是这种情况,您可以创建两个单独的查询
第一个查询是 "get parent doc with id = 1"
第二个查询是 "get all child docs with parent_id = 1"
并且您可以使用 Elasticsearch 的 "multisearch API" 在一个网络调用中将这两个请求发送到 elasticsearch
您可以使用以下示例从父索引和子索引进行搜索。希望这对您有所帮助。
GET indexname/_search
{
"query": {
"bool": {
"must": [
{
"bool": {
"must": [
{
"term": {
"parentField": {
"value": "valuetosearch"
}
}
}
]
}
},
{
"has_child": {
"type": "childindex",
"query": {
"range" : {
"childindexField" : {
"lte": "value"
}
}
}
}
}
]
}
}
}