为了优化我的查询时间,我想要跳过嵌套查询和父子关联查询,其实有很多时候我的查询条件,关注的是有没有,而不是 是什么。
所以我完全可以通过打标签的方式,跳过嵌套查询和父子关联查询。
举个栗子:我的软件信息是嵌套类型的,而我展示结果的时候想要把带有软件信息的放在前边展示。这个需求里边我并不关注软件的内容,关注的只是有软件信息的。但是我查询条件在做打分排序的时候,我需要对软件的字段进行should,它是嵌套查询的。
基于以上想法,我想把包含软件信息的打上一个标签:这样我查的时候,只需要对非嵌套类型的标签进行should,跳过了嵌套查询。
所以用到了这条语句:update_by_query
为了实现这个需求,我也是努力的查看了官网,但是感觉还是不是很清晰,又问了elasticsearch社区的人。最终把这个语句写出来了!
但是还有一些问题,下边介绍。先介绍语句。
先介绍一下使用的两个栗子,基本上也就两种情况了,一种是原来没有值,然后添加值;一种是原来有值,然后修改。
# # 情景一:update_by_query,其中update的内容为添加的内容
为了方便以后扩展,我这个标签是两层。外层是 labels ,第二层是:hasSoftType
POST device_search_20200716/_update_by_query?conflicts=proceed&timeout=1d&&slices=5
{
"script": {
// labels 是一级字段 params是下边定义的,里边存放着二级字段,和二级字段的值
"source": "ctx._source.put('labels',params.labels)",
"lang": "painless",
"params":{
"labels":{
"hasSoftType":"1"
}
}
},
"query": {
"bool": {
"must": [
{
"exists": {
"field": "deviceInfo.deviceType"
}
}
],
"must_not": [
{
"term": {
"labels.hasSoftType": {
"value": "1"
}
}
}
]
}
}
}
# # 情景二:update_by_query,其中update的内容为修改的内容
执行这个的时候,如果要修改的字段没有内容会报错
POST device_search_20200716/_update_by_query?conflicts=proceed
{
"script": {
"source": "ctx._source['labels'].hasSoftType='2';",
"lang": "painless"
},
"query": {
"bool": {
"must": [
{
"exists": {
"field": "deviceInfo.deviceType"
}
}
],
"must_not": [
{
"term": {
"labels.hasSoftType": {
"value": "1"
}
}
}
]
}
}
}
# # 情景三:update_by_query,其中update的字段是一级字段,没有嵌套关系
POST device_search_20200716/_update_by_query?conflicts=proceed
{
"script": {
"source": "ctx._source['labels']='2';",
"lang": "painless"
},
"query": {
"bool": {
"must": [
{
"exists": {
"field": "deviceInfo.deviceType"
}
}
],
"must_not": [
{
"term": {
"labels.hasSoftType": {
"value": "1"
}
}
}
]
}
}
}
# # 官网文档上的内容以及需要主义的点
待整理