gpt4 book ai didi

arrays - Elasticsearch 必须有一些值,而不是所有其他值

转载 作者:搜寻专家 更新时间:2023-11-01 00:49:59 26 4
gpt4 key购买 nike

所以我有一个具有以下映射的索引:

{
"tests": {
"mappings": {
"test": {
"properties": {
"arr": {
"properties": {
"name": {
"type": "long"
}
}
}
}
}
}
}

我有 3 个文档,字段“arr”具有以下值:

  1. arr: [{name: 1}, {name: 2}, {name: 3}]
  2. arr: [{name: 1}, {name: 2}, {name: 4}]
  3. arr: [{name: 1}, {name: 2}]

我想以一种可以找到所有名称值都在名称数组中的文档的方式进行搜索。但是,文档不需要包含数组的所有值,如果有一个值不在数组中,那么文档就不好。

例如:

  1. 如果我的姓名数组是[1,2],那么我只想要文件 3,但我拥有所有文件
  2. 如果我的名称数组是[1,2,3],那么我想要文档 1 和 3,但我只有文档 1 和 must 以及所有他们用 should
  3. 如果我的名字数组是[1,2,4],那么我想要文档 2 和 3,但我只有文档 2 和 must 以及所有他们用 should
  4. 如果我的名字数组是[1],那么我不需要文档,但我有所有的名字

在这里,数组很小,在我的项目中,文档中的数组要大得多,比较数组也是如此。

所以,具体来说,我需要以一种方式进行搜索:

  1. 文档中的所有名字都在名字数组中
  2. 文档不需要包含名称数组中的所有值

提前致谢

最佳答案

使用脚本(无映射更改)

不需要对您已有的映射进行任何更改。

我想出了下面的脚本。我相信核心逻辑在我认为不言自明的脚本中。

POST test_index_arr/_search
{
"query":{
"bool": {
"filter": {
"script": {
"script": {
"source" : """
List myList = doc['arr.name'];
int tempVal = myList.size();
for(int i=0; i<params.ids.size(); i++){
long temp = params.ids.get(i);
if(myList.contains(temp))
{
tempVal = tempVal - 1;
}

if(tempVal==0){
break;
}
}

if(tempVal==0)
return true;
else
return false;
""",
"lang" : "painless",
"params": {
"ids": [1,2,4]
}
}
}
}
}
}
}

所以脚本所做的是,它检查文档是否在其 arr 中的所有编号都出现在输入中,如果是,它将返回文档。

在上面的查询中,"ids": [1,2,4] 部分作为输入。您需要根据您的要求在此处添加/删除/更新值。

希望对您有所帮助!

关于arrays - Elasticsearch 必须有一些值,而不是所有其他值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53458569/

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