首页 > 解决方案 > Elasticsearch - 在嵌套字段值中搜索键,这是一个 json

问题描述

对于我尝试执行的查询,我需要一些帮助。

我的一个索引中有一个名为 scores 的字段,该字段将一些 ai 模型分数存储为json. 该字段的基本结构如下(显示索引中的几条记录):

[{"scores":
    {"a/b": 1.231,
     "a/c": 23.11,
     "x/a": 1232.1}},
 {"scores":
    {"a/d": 3.1}}]

映射类似于:

{"scores":
  {"properties":
    {"a/b": {"type":"float"},
     "a/c": {"type":"float"},
     "a/d": {"type":"float"}}}}

另一个字段分数的值json将具有任意字段,即我json事先不知道其中存在哪些字段。

我想要做的是搜索里面的键,json即如果我搜索a/,它应该返回[“a/b”,“a/d”,“a/c”]。

我知道这可以通过嵌套查询实现,但看起来我需要重新映射我的索引,以便字段分数具有更扁平的数据结构。但是我现在不想这样做,只想使用现有结构并执行我的查询。

如果有人对此有任何想法,请按照我的方式提出。

标签: elasticsearch

解决方案


您可以使用_source来限制检索的内容:

POST indexname/_search
{
 "_source": "scores.a/*"
}

或者,您可以使用script_fields完全相同的方法,但也可以为值修改提供游戏空间:

POST indexname/_search
{
  "script_fields": {
   "scores_prefixed_with_a": {
     "script": {
       "source": """params._source.scores.entrySet()
                        .stream()
                        .filter(e->e.getKey().startsWith(params.prefix))
                        .collect(Collectors.toMap(e->e.getKey(),e->e.getValue()))""",
       "params": {
         "prefix": "a/"
       }
     }
   }
 }
}

推荐阅读