ElasticSearch multi_match如果字段存在应用过滤器,否则不担心它?

Red*_*ile 7 elasticsearch

所以我们得到了一个弹性搜索实例,但是一项工作需要"组合搜索"(单个搜索字段,具有types跨特定索引的复选框)

这很好,我只是将这种搜索应用于我的索引(为了简洁:/ posts):

{
    "query": {
        "multi_match": {
            "query": querystring, 
            "type":"cross_fields",
            "fields":["title","name"] 
            }
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您可能从这里对multi_match的需求所猜测的那样,每种类型的模式都以这种或那种方式不同.这就是我现在面临的挑战.

在其中一种类型中,只有一种,有一个字段在其他类型中不存在,它被调用active,它是一个基本的布尔0或1.
我们想索引类型中的非活动项目以进行管理搜索,但我们不知道t希望此类型的非活动项目在搜索时向公众公开.

据我所知和理解,我想使用过滤器.但是当我提供一个要求为active1 的过滤器时,我现在只能从该类型获得结果,而不是其他任何东西.因为现在它明确地查找具有该字段且等于1的项目.

如何进行条件"if field exists,确保它等于1,否则忽略这个条件"?这甚至可以实现吗?

And*_*fan 10

如果字段存在,请确保它等于1,否则忽略此条件

我认为它可以像这样实现:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "should": [
            {
              "bool": {
                "must": [
                  {
                    "exists": {
                      "field": "active"
                    }
                  },
                  {
                    "term": {
                      "active": 1
                    }
                  }
                ]
              }
            },
            {
              "missing": {
                "field": "active"
              }
            }
          ]
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

和完整的查询:

{
  "query": {
    "filtered": {
      "query": {
        "multi_match": {
          "query": "whatever",
          "type": "cross_fields",
          "fields": [
            "title",
            "name"
          ]
        }
      },
      "filter": {
        "bool": {
          "should": [
            {
              "bool": {
                "must": [
                  {
                    "exists": {
                      "field": "active"
                    }
                  },
                  {
                    "term": {
                      "active": 1
                    }
                  }
                ]
              }
            },
            {
              "missing": {
                "field": "active"
              }
            }
          ]
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)