有没有一种方法可以在弹性中执行嵌套过滤而不影响文档是否匹配?

时间:2019-11-21 16:43:35

标签: elasticsearch

我的搜索文档代表一种产品,并且在其中有[Nested]个SKU列表。

我今天意识到,如果没有与嵌套查询匹配的SKU,则不会返回文档。我误以为我的嵌套查询不会影响是否返回文档,而只会影响我查询的嵌套项目。

如果文件符合我的顶级查询并且只有嵌套查询影响嵌套列表中的项目,是否可以弹性地返回文档?

我当然不喜欢嵌套类型,如果有其他方法可以做到这一点,那么我会不知所措。

示例查询如下:

{
    "from": 0,
    "size": 24,
    "query": {
        "bool": {
            "filter": [
                {
                    "term": {
                        "lang": {
                            "value": "en"
                        }
                    }
                },
                {
                    "range": {
                        "launchDateTime": {
                            "lte": "2019-11-21T00:00:00-06:00",
                            "relation": "within"
                        }
                    }
                },
                {
                    "nested": {
                        "query": {
                            "range": {
                                "sKUs.visibilityStartDateTime": {
                                    "lte": "2019-11-21T00:00:00-06:00",
                                    "relation": "within"
                                }
                            }
                        },
                        "path": "sKUs",
                        "ignore_unmapped": false
                    }
                },
                {
                    "nested": {
                        "query": {
                            "range": {
                                "sKUs.visibilityEndDateTime": {
                                    "gt": "2019-11-21T00:00:00-06:00",
                                    "relation": "within"
                                }
                            }
                        },
                        "path": "sKUs",
                        "ignore_unmapped": false
                    }
                }
            ]
        }
    },
    "aggs": {...}
}

从本质上讲,即使没有可见的SKU,我仍然希望退回产品。在过滤返回的SKU的同时,是否有办法做到这一点?

编辑: 部分映射如下:

{
  "mapping": {
    "productsearchdocument": {
      "properties": {
        ...
        "sKUs": {
          "type": "nested",
          "properties": {
            ...
            "visibilityStartDateTime": {
              "type": "date"
            },
            "visibilityEndDateTime": {
              "type": "date"
            },
            ...
          }
        },
        ...
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

解决方案是使用“应该”过滤器,以便无论嵌套查询是否匹配任何内容,仍返回我的顶级文档。唯一的问题是它会影响分数,这是不希望的。但是,我们拥有内部评分系统,可在除文本搜索之外的所有情况下使用。