栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Elasticsearch脚本中访问嵌套数组的doc值?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Elasticsearch脚本中访问嵌套数组的doc值?

对于您的特定问题,脚本需要嵌套上下文,就像您对

term
查询所做的一样。

可以为ES 1.x重写:

curl -XGET 'localhost:9200/test/_search' -d'{  "query": {    "nested": {      "path": "skills",      "query": {        "filtered": {          "filter": { "term": {   "skills.skill_id": 100 }          },          "query": { "function_score": {   "functions": [     {       "script_score": {         "script": "sqrt(1.2 * doc['skills.recommendations_count'].value)"       }     }   ] }          }        }      }    }  }}'

对于ES 2.x(过滤器在ES 2.x中成为一等公民,因此语法进行了一些更改以跟上!):

curl -XGET 'localhost:9200/test/_search' -d'{  "query": {    "nested": {      "path": "skills",      "query": {        "bool": {          "filter": { "term": {   "skills.skill_id": 100 }          },          "must": { "function_score": {   "functions": [     {       "script_score": {         "script": "sqrt(1.2 * doc['skills.recommendations_count'].value)"       }     }   ] }          }        }      }    }  }}'

注意:我使

term
查询成为
term
过滤器,因为它对分数没有逻辑影响(无论是完全匹配还是不完全匹配)。我还将嵌套字段的名称添加到了
term
过滤器中,这是Elasticsearch
2.x和更高版本(以及先前的良好实践)的要求。

这样一来,您就可以( 并且
应该)避免尽可能使用脚本。这是其中一种情况。

function_score
支持
field_value_factor
功能的概念,该功能使您可以完全按照自己的尝试去做,但完全不需要脚本。您还可以选择提供一个“
missing”值来控制如果缺少该字段会发生什么。

这将转换为 完全相同 的脚本,但是会表现得更好:

curl -XGET 'localhost:9200/test/_search' -d'{  "query": {    "nested": {      "path": "skills",      "query": {        "filtered": {          "filter": { "term": {   "skills.skill_id": 100 }          },          "query": { "function_score": {   "functions": [     {       "field_value_factor": {         "field": "skills.recommendations_count",         "factor": 1.2,         "modifier": "sqrt",         "missing": 0       }     }   ] }          }        }      }    }  }}'

对于ES 2.x:

curl -XGET 'localhost:9200/test/_search' -d'{  "query": {    "nested": {      "path": "skills",      "query": {        "bool": {          "filter": { "term": {   "skills.skill_id": 100 }          },          "must": { "function_score": {   "functions": [     {       "field_value_factor": {         "field": "skills.recommendations_count",         "factor": 1.2,         "modifier": "sqrt",         "missing": 0       }     }   ] }          }        }      }    }  }}'

脚本很慢,并且 暗示着Elasticsearch
1.x中使用fielddata,这很糟糕。您确实提到了doc值,这是一个有希望的开端,它表明使用Elasticsearch 2.x,但这可能只是术语。

如果您只是从Elasticsearch开始,那么我强烈建议从最新版本开始。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/397871.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号