elasticsearch - 如何通过对象值字段过滤Elasticsearch

标签 elasticsearch

我们的表具有嵌套的 map 角色,如下所示:

{group: 123, roles: {boss: department1, manager: department2}}
现在,我想找到在部门1中起作用的123组中的所有文档。
如何根据嵌套 map 的值字段进行过滤?
就像是:
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "group": "123"
          }
        },
        {
          "nested": {
            "path": "roles",
            "query": {
              "match": {
                "roles.???": "department1"
              }
            }
          }
        }
      ]
    }
  }
}
我知道如何通过嵌套的对象键进行过滤,但是找不到“对象值”进行过滤。

最佳答案

this answer启发,您可以编写解决方案的脚本:

{
  "min_score": 0.1,
  "query": {
    "function_score": {
      "query": {
        "match": {
          "group": "123"
        }
      },
      "functions": [
        {
          "script_score": {
            "script": {
              "source": """
                for (def role : params["_source"]["roles"].values()) {
                  if (role == params.role) {
                    return 1
                  }
                }
                
                return 0;
              """,
              "params": {
                "role": "department1"
              }
            }
          }
        }
      ]
    }
  }
}
不过要注意脚本的低效率-可能会变得很慢。
相反,我建议您重新考虑您的结构-保持嵌套,但是
{
  "group": 123,
  "roles": [
    {
      "position": "manager",
      "department": "department1"
    },
    {
      "position": "boss",
      "department": "department2"
    }
  ]
}

关于elasticsearch - 如何通过对象值字段过滤Elasticsearch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63309131/

相关文章:

elasticsearch - 无痛脚本Math.max更改我的数据类型

python - 如何使用Python在ES中自动生成id

java - 如何在 java 中使用 Elasticsearch Rest api?

elasticsearch - 常量分数查询 elasticsearch boosting

java - 是否有 API/代码可以从 kibana 视觉效果、仪表板、图表中获取 id 列表?

elasticsearch - ElasticSearch。索引中唯一词的总数

elasticsearch - Elasticsearch管道无法访问@myfield

javascript - 使用 AJAX 在 elasticsearch 中查询动态聚合

python - 过滤后的汇总无结果

elasticsearch - Elasticsearch查找字段具有特定值的位置