当前位置: 首页 > 知识库问答 >
问题:

如何按对象值字段过滤Elasticsearch

东方俊力
2023-03-14

我们的表有一个嵌套的映射角色,如下所示:

{group: 123, roles: {boss: department1, manager: department2}}

现在我要查找组123中在Department1中有角色的所有文档。如何基于嵌套映射的值字段进行筛选?类似于:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "group": "123"
          }
        },
        {
          "nested": {
            "path": "roles",
            "query": {
              "match": {
                "roles.???": "department1"
              }
            }
          }
        }
      ]
    }
  }
}

我知道如何通过嵌套对象键进行筛选,但无法找到通过“对象值”进行筛选。

共有1个答案

施洛城
2023-03-14

受此答案的启发,您可以编写解决方案的脚本:

{
  "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"
    }
  ]
}
 类似资料:
  • 问题内容: 我有一个由对象填充的ArrayList。 我的对象类称为有两个字段; 我想使用该字段过滤列表,为了进行测试,我使用了字符串“ test”。 我用了来自谷歌的番石榴,它可以过滤ArrayList。 这是我尝试的代码: 但是此代码不起作用。 问题答案: 这是正常的:Predicates.containsPattern()在s上操作,您的对象未实现。 您需要编写自己的谓词: 然后使用: 但是

  • 下面是我的搜索响应示例,检索到4个结果。 现在,我想根据下面的标准,根据特定的“dir”字段值过滤上述搜索结果。 在且仅在以下情况下将搜索结果包含在响应中: 如果“dir”字段值等于“/shared”或“/private/hitesh” 如果“dir”字段值以“/shared/”或“/private/hitesh/”开头,则为其他 如何在ElasticSearch中实现上述功能?

  • 问题内容: 我试图在AngularJS中创建一个自定义过滤器,该过滤器将通过特定属性的值过滤对象列表。在这种情况下,我要按“极性”属性(“正”,“中性”,“负”的可能值)进行过滤。 这是我没有过滤器的工作代码: HTML: 这是JSON格式的“ $ scope.tweets”数组: 我可以提出的最佳过滤器如下: 此方法返回一个空数组。从“ console.log(polarity)”语句中不会打印

  • 问题内容: 我喜欢使用jq过滤json文件: 给定json包含对象数组: 我想过滤该列表以仅显示ID值为2和4的元素,因此预期的输出为: 如何使用jq过滤json?我玩过select和map,但是没有任何一个可以使用,例如: 问题答案: 从文档: 输入项 输出量 我认为您可以执行以下操作:

  • 问题内容: 我有许多产品要重复使用ng-repeat,并且正在使用 按颜色过滤这些产品。过滤器正在运行,但是如果产品名称/说明等包含颜色,则在应用过滤器后该产品仍然存在。 如何将滤镜设置为仅应用于数组的颜色字段而不是每个字段? 问题答案: 请参阅过滤器页面上的示例。使用一个对象,并在color属性中设置颜色:

  • 例如insert时需要忽略某个特定属性, update时只更新某些属性, 查询时需要跳过大字段等。 FieldFilter/FieldMatcher提供细致的过滤选项,包括: 黑名单(locked) 白名单(actived) 忽略空值(ignoreNull) 忽略数值0(ignoreZero) 忽略日期属性(ignoreDate) 忽略空字符串(ignoreBlankStr) 忽略数值型主键(ig