仅当索引具有字段时,Elasticsearch才会对索引使用过滤器

时间:2017-09-14 08:41:41

标签: elasticsearch

有两个索引:categoriesposts

类别

  • 姓名

帖子

  • 姓名
  • publish_at
  • publish_until

我想对两个索引进行查询,并在publish_at上使用过滤器,publish_until索引使用posts

http://localhost:9200/categories,posts/_search

{
      "query": {
          "bool": {
              "must": {
                  "multi_match": {
                      "query": "keyword",
                      "fields": [
                          "name^3",
                          "body"
                      ]
                  }
            },
            "filter": [{
                "bool": {
                    "must": [
                        { 
                            "range": {
                                "publish_at": {
                                    "lte" : "now"
                                }
                            }
                        },
                        { 
                            "range": {
                                "publish_until": {
                                    "gt" : "now"
                                }
                            }
                        }
                    ]
                }
            }]
        }
    }
}

此查询仅向我提供posts作为结果。我的结果中也需要categories

如何将日期范围过滤器仅应用于包含publish_atpublish_until字段的索引,并跳过其他索引的日期范围过滤器?

1 个答案:

答案 0 :(得分:1)

在摆弄了bool一天之后,我开始工作了。

{
    "query": {
        "bool" : {
            "must" : [
                {
                    "multi_match": {
                        "query": "keyword",
                        "fields": [
                            "name^3",
                            "body"
                        ]
                    }
                }, 
                {
                    "bool": {
                        "should": [
                            {
                                "bool": {
                                    "must": [
                                        {
                                             "range": {
                                                "publish_at": {
                                                    "lte" : "now"
                                                }
                                            }
                                        },
                                        {
                                            "range": {
                                                "publish_until": {
                                                    "gt" : "now"
                                                }
                                            }
                                        }
                                    ]
                                }
                            },
                            {
                                "bool": {
                                    "must_not": [
                                        {
                                            "exists": {
                                                "field": "publish_at"
                                            }
                                        },
                                        {
                                            "exists": {
                                                "field": "publish_until"
                                            }
                                        }
                                    ]
                                }
                            }
                        ]
                    }
                }
            ]
        }
    }
}