如何在Elasticsearch中的多(全局)索引搜索中对特定索引的特定字段应用条件?

时间:2016-01-08 10:12:54

标签: elasticsearch

让我们说我想对这两个索引进行全局搜索:主题,用户。

这两个索引包含以下字段:

用户:[first_name] 主题:[title,description,is_public]

我现在正在使用此查询:

{"query":
    {"bool":
        {"should":[
            {"wildcard": {"first_name": "*usicTerm"}},
            {"wildcard": {"title": "*usicTerm"}},
        ]},
        "index": ["users", "themes"]
    },
    "from":0,"size":10,"sort":[]
}

现在有了这个,我想通过名为" is_public"的特定主题字段过滤所有主题结果,所以我尝试了:

{"query":
    {"bool":
        {"should":[
            {"wildcard": {"first_name": "*usicTerm"}},
            {"wildcard": {"title": "*usicTerm"}}
        ]},
        {"must": [
             {"term": {"is_public": true}}
        ]}
        "index": ["users", "themes"]
    },
    "from":0,"size":10,"sort":[]
}

但这并不起作用,因为它也过滤掉所有用户没有字段的索引结果" is_public"为真,因为这个指数甚至没有这个字段!

所以任何人都可以告诉我如何应用这个"必须"条款只适用于我的主题"指数?

谢谢:)

大卫。

1 个答案:

答案 0 :(得分:1)

如果is_public始终存在(因此它是false或true,永远不会从文档中丢失),您可以尝试以下方法:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "should": [
            {
              "missing": {
                "field": "is_public"
              }
            },
            {
              "term": {
                "is_public": "true"
              }
            }
          ]
        }
      }
    }
  }
}

ES 2.0中的过滤器发生了变化,因此可能看起来会有所不同,具体取决于您使用的ES版本。