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

时间:2015-10-29 01:15:18

标签: elasticsearch

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

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

{
    "query": {
        "multi_match": {
            "query": querystring, 
            "type":"cross_fields",
            "fields":["title","name"] 
            }
        } 
    }
}

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

在其中一种类型中,只有一种,有一个字段在其他类型中不存在,它被称为active,它是一个基本的布尔值0或1.
我们希望为管理搜索目的索引类型中的非活动项目,但我们不希望此类型的非活动项目在搜索时向公众公开。

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

如何执行条件"如果字段存在,请确保它等于1,否则忽略此条件"?这甚至可以实现吗?

1 个答案:

答案 0 :(得分:10)

  

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

我认为它可以这样实现:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "should": [
            {
              "bool": {
                "must": [
                  {
                    "exists": {
                      "field": "active"
                    }
                  },
                  {
                    "term": {
                      "active": 1
                    }
                  }
                ]
              }
            },
            {
              "missing": {
                "field": "active"
              }
            }
          ]
        }
      }
    }
  }
}

和完整的查询:

{
  "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"
              }
            }
          ]
        }
      }
    }
  }
}