gpt4 book ai didi

Elasticsearch - 对嵌套对象列表进行脚本过滤

转载 作者:行者123 更新时间:2023-11-29 02:52:34 24 4
gpt4 key购买 nike

我正在尝试弄清楚如何解决我的 ES 5.6 索引遇到的这两个问题。

"mappings": {
"my_test": {
"properties": {
"Employee": {
"type": "nested",
"properties": {
"Name": {
"type": "keyword",
"normalizer": "lowercase_normalizer"
},
"Surname": {
"type": "keyword",
"normalizer": "lowercase_normalizer"
}
}
}
}
}
}

我需要创建两个独立的脚本过滤器:

1 - 过滤员工数组大小为 == 3 的文档

2 - 过滤数组第一个元素为 "Name"== "John"的文档

我试图迈出第一步,但无法遍历列表。我总是出现空指针异常错误。

{
"bool": {
"must": {
"nested": {
"path": "Employee",
"query": {
"bool": {
"filter": [
{
"script": {
"script" : """

int array_length = 0;
for(int i = 0; i < params._source['Employee'].length; i++)
{
array_length +=1;
}
if(array_length == 3)
{
return true
} else
{
return false
}

"""
}
}
]
}
}
}
}
}
}

最佳答案

正如 Val 所注意到的,在最新版本的 Elasticsearch 中,您无法在脚本查询中访问文档的 _source。但是 elasticsearch 允许您在“分数上下文”中访问此 _source

因此,一个可能的解决方法(但您需要注意性能)是在您的查询中结合使用脚本分数和 min_score。

您可以在此堆栈溢出帖子中找到此行为的示例 Query documents by sum of nested field values in elasticsearch .

在您的情况下,这样的查询可以完成这项工作:

POST <your_index>/_search
{
"min_score": 0.1,
"query": {
"function_score": {
"query": {
"match_all": {}
},
"functions": [
{
"script_score": {
"script": {
"source": """
if (params["_source"]["Employee"].length === params.nbEmployee) {
def firstEmployee = params._source["Employee"].get(0);
if (firstEmployee.Name == params.name) {
return 1;
} else {
return 0;
}
} else {
return 0;
}
""",
"params": {
"nbEmployee": 3,
"name": "John"
}
}
}
}
]
}
}
}

应在参数中设置员工的数量和名字,以避免为该脚本的每个用例重新编译脚本。

但是请记住,正如 Val 已经提到的那样,它对您的集群来说可能非常繁重。您应该通过在 function_score 查询(在我的示例中为 match_all )中添加过滤器来缩小您将在其上应用脚本的文档集。在任何情况下,这都不是 Elasticsearch 的使用方式,您不能指望通过这种被黑的查询获得出色的性能。

关于Elasticsearch - 对嵌套对象列表进行脚本过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56904934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com