您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
elasticSearch中的has_parent查询
发布时间:2021-09-02 13:30:10编辑:雪饮阅读()
在elasticSearch中has_parent查询是以查父文档中的内容得到子文档。
意思就是说,我根据一个查询条件,我是查询匹配到的父文档的,比如我查询条件是name,那么我就查询父文档中比如name为xxx的父文档,得到这些name为xxx的父文档后,当时我并不是返回这些父文档给请求者,而是返回这些父文档中的子文档给请求者。
要想使用has_parent,这第一步就是需要建立父子关系索引:
请求正文:
{
"mappings": {
"properties": {
"my_id": {
"type": "keyword"
},
"my_join_field": {
"type": "join",
"relations": {
"question": "answer"
}
}
}
}
}
响应正文:
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "my-index-0000010"
}
然后第二步应该就是创建该索引下面的映射:
由于在某个版本之后貌似创建父子关系索引后就自动创建了_doc映射,即便你仅仅指定url到索引级别,但是此时你若再次创建映射就会报错,意思大概就是一个索引不可拥有多个映射。那么这句话更严谨的来说,可能普通索引也会是这样,不仅仅是父子关系索引,这个后面再研究,反正我这里elasticsearch-7.14.0-windows-x86_64目前就是遇到了这种情况。
那么所以我这里创建映射这一步就先跳过了。
那么接下来就是索引父文档:
请求正文:
{
"name":"Parent School1", "description":"CBSE Affiliation", "street":"Nagan",
"city":"paprola", "state":"HP", "zip":"176115", "location":[31.8955385, 76.8380405],
"fees":2200, "tags":["Senior Secondary", "beautiful campus"], "rating":"3.3",
"my_join_field": {
"name":"question"
}
}
再接下来就是索引子文档:
请求正文:
{
"comment":"I am learning ELK",
"username":"Jack",
"name":"Child School",
"my_join_field":{
"name":"answer",
"parent":"question1"
}
}
那么接下来才是今天的正题,即has_parent:
请求正文:
{
"query": {
"has_parent": {
"parent_type": "question",
"query" : {
"match": {
"name" : "Parent"
}
}
}
}
}
响应正文如:
{
"took": 957,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "my-index-0000010",
"_type": "_doc",
"_id": "answer1",
"_score": 1.0,
"_routing": "question1",
"_source": {
"comment": "I am learning ELK",
"username": "Jack",
"name": "Child School",
"my_join_field": {
"name": "answer",
"parent": "question1"
}
}
},
{
"_index": "my-index-0000010",
"_type": "_doc",
"_id": "answer2",
"_score": 1.0,
"_routing": "question2",
"_source": {
"comment": "I am learning ELK",
"username": "Jack",
"name": "Child School",
"my_join_field": {
"name": "answer",
"parent": "question1"
}
}
}
]
}
}
那么在has_parent查询中你可能会出现错误如:
[has_parent] no join field has been configured
类似这种错误,你就要检查下has_parent请求的索引名称和你建立父子关系的那个索引名称是否一致。
我就在这里栽了跟头,因为我的索引名称不好辨识,肉眼很难分辨是否一直,太多000了,看的眼睛花,还为此去折腾了一下外国友人。。。
另外比较注意的是一些老文档中是有让你建立映射的,实际上这里映射是不能再建立的。已经内置_doc映射了。
关键字词:elasticSearch,has_parent