首页 > 解决方案 > 按 ElasticSearch 中另一个字段的值过滤值

问题描述

我想知道如何通过另一个字段的值过滤字段的值,例如:

这是映射

PUT /test
{
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "testArr": {
        "type": "text"
      },
      "testArr2": {
        "type": "text"
      }
    }
  }
}

文件:

PUT /test/_doc/1
{
  "testArr": ["1", "2", "3"],
  "testArr2": ["2"]
}

如何仅返回字段testArr中不存在的字段值testArr2结果,我想看到这样的东西:

{
  "_source": {
    "testArr": ["1", "3"]
  }
}

我尝试了什么:

GET /test/_search
{
  "_source": "testArr",
  "query": {
    "bool": {
      "filter": {
        "script": {
          "script": {
            "source": "!doc['testArr2'].contains(doc['testArr'].value)",
            "lang": "painless"
          }
        }
      }
    }
  }
}

看起来它有效,但它返回所有值 [“1”,“2”,“3”],我只需要在结果 = [“1”,“3”] 上有所不同,而不是所有值

标签: elasticsearch

解决方案


对于那些将搜索答案的人,我在script_fields中找到了解决方案:

GET /test/_search
{
  "script_fields": {
    "filtered": {
      "script": {
        "source": "ArrayList result = []; for(Object v:doc['testArr']) { if(!doc['testArr2'].contains(v)) { result.add(v); } } return result;",
        "lang": "painless"
      }
    }
  }  
}

推荐阅读