Arrays Elasticsearch必须包含一些值,而不能包含所有其他值
因此,我有一个具有以下映射的索引:Arrays Elasticsearch必须包含一些值,而不能包含所有其他值,arrays,node.js,elasticsearch,search,Arrays,Node.js,elasticsearch,Search,因此,我有一个具有以下映射的索引: { "tests": { "mappings": { "test": { "properties": { "arr": { "properties": { "name": { "type": "long"
{
"tests": {
"mappings": {
"test": {
"properties": {
"arr": {
"properties": {
"name": {
"type": "long"
}
}
}
}
}
}
}
我有3个文档,字段“arr”的值如下:
arr:[{name:1},{name:2},{name:3}]
arr:[{name:1},{name:2},{name:4}]
arr:[{name:1},{name:2}]
[1,2]
,那么我只需要文档3,但我拥有所有的名称[1,2,3]
,那么我想要文档1和3,但我只有必须的文档1,所有必须
[1,2,4]
,那么我想要文档2和3,但我只有必须的文档2,所有都应该
[1]
,那么我不需要文档,但我拥有所有文档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]
}
}
}
}
}
}
}
测试后索引\u arr/\u搜索
{
“查询”:{
“布尔”:{
“筛选器”:{
“脚本”:{
“脚本”:{
“来源”:”
列表myList=doc['arr.name'];
int tempVal=myList.size();
对于(int i=0;我是否可以像添加其他字段一样控制映射?准确地说,只需添加一个字段即可。是的,我可以使用它执行任何操作:)抱歉,我已更新了我的答案。请告诉我是否有帮助!这是一个很好的解决方案,但适用于数组中元素很少的小数组。在您的查询中,如果我有一个名为“1/4”
的文档,并且要使其正常工作,我必须添加“1/4”"
到术语查询。对于小数组,它可以工作,但是数组中有超过20或50个项目和我的文档,我必须尽一切可能使它工作,这真的很好吗?@ArrowLightning有效点。我想出了另一个解决方案,不需要更改映射。请检查并告诉我它是否有帮助。我一直都在考虑ady之前考虑过脚本,我想知道是否还有其他选择,但脚本很好用!