elasticsearch 查询多个映射,并且仅当每个映射中至少有 1 个值满足时才返回

问题描述 投票:0回答:1

我的文档中有一个字段可以包含多个这样的地图

"allCodesRequired": [
  {
    "mapKey1": ["one", "two"]
  },
  {
    "mapKey2": ["foo", "bar"]
  }
]

每个地图中的每个值都必须匹配。因此,如果我有一个像这样的查询值

["one", "bar"]
它应该返回文档,但如果我只有一个像这样的查询值
["one"]
它将失败,因为
one
不存在于地图 2 中。

我尝试过使用跨字段的多重匹配,但是使用这样的查询值

["one"]
它仍然会返回上述情况的文档。

这是我尝试过的查询

{
  "query": {
    "multi_match" : {
      "query":      "one",
      "type": "cross_fields",
      "fields":     [ "allCodesRequired.*" ],
      "operator":   "and"
    }
  }
}

更新

我尝试使用脚本查询,但显然它不支持嵌套对象。

elasticsearch elasticsearch-dsl
1个回答
0
投票

您需要在 Elasticsearch 中结合使用嵌套查询和脚本。

multi_match
查询在这里无法正常工作,因为它无法按照您需要的方式处理嵌套结构。嵌套查询允许您单独查询每个嵌套对象 (allCodesRequired),并且脚本可以帮助强制执行每个嵌套映射中至少有一个匹配项的逻辑。

{
  "query": {
    "nested": {
      "path": "allCodesRequired",
      "query": {
        "bool": {
          "must": [
            {
              "script_score": {
                "script": {
                  "source": """
                    def matches = 0;
                    for (item in params.queryValues) {
                      for (key in doc['allCodesRequired.mapKey1.keyword']) {
                        if (key == item) {
                          matches++;
                          break;
                        }
                      }
                    }
                    return matches
                  """,
                  "params": {
                    "queryValues": 
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.