1.因为业务需要查询父文档以及其下子文档,搞了很久才理清楚。
首先还是Inner_hits,inner_hits只能用在nested,has_child,has_parents查询里面
{
"query": {
"nested": {
"path": "comments",
"query": {
"match": { "comments.text": "awesome" }
},
"inner_hits": {} // 使用inner_hits来返回匹配的comments
}
}
}
"has_child": {
"type": "dys_static_info.md5",
"inner_hits":{},
childQuery
}
如果直接用在开始查询的对象里面,查询会报错
然后这里明确一个概念,has_child是查父文档的,里面加了inner_hits多返回的inner_hits是子文档的内容。同理,has_parent查子文档的,面加了inner_hits多返回的inner_hits是父文档的内容。
2.还是业务需求,一个索引下面有多种类型的文档,他们之间是父子关系,如果我要更新一个文档里面的值无法直接更新,需要使用script.比如我要更新index索引下面doc文档里面的filed1字段和filed2字段,更新条件是filed3字段为123。要这么写·
POST /index/_update_by_query
{
"script": {
"source": "ctx._source['doc']['filed1'] = params.tags;ctx._source['doc']['filed2'] = params.state;",
"lang": "painless",
"params": {
"tags": [1, 2],
"state":"W"
}
},
"query": {
"term": {
"doc.filed3.keyword": "123"
}
}
}
然后使用golang的github.com/olivere/elastic/v7 得这么写
updateQuery := elastic.NewTermQuery("doc.filed3.keyword", "123")
script = elastic.NewScript(`
ctx._source['doc']['filed1'] = params.tags;
ctx._source['doc']['filed2'] = params.state;
`).Params(map[string]interface{}{"tags": TagList, "state": SampleState})
_, err = global.GVA_ES.UpdateByQuery("index").Query(updateQuery).Script(script).Do(context.Background())
if err != nil {
return
}
response.Ok(c)
}