ElasticSearch - 从不同的索引中获取不同的类型

ElasticSearch - Get different types from different indices

我有两个索引:AB

A有以下类型:carmotorbikevan.

B有以下类型:buscarpickup.

我希望能够有一个查询从 A 获取 motorbikevan 以及从 [=12] 获取 carpickup =].

我想使用 filter 来执行此操作,目前我有:

.filter(
   not(
      should(
         termsQuery("key", Seq("car", "bus"))
      )
   )
)

但显然,这将过滤两个索引的 car。我知道我可以为每个索引执行两个单独的查询并为每个索引过滤不同的类型,但我想尽可能避免这种情况。

是否可以在单个查询中完成我想做的事情?

你可以这样做。

GET _search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "filter": [
              {
                "term": {
                  "_index": {
                    "value": "A"
                  }
                }
              },
              {
                "terms": {
                  "_type":  ["motorbike","van"]

                }
              }
            ]
          }
        },
        {
          "bool": {
            "filter": [
              {
                "term": {
                  "_index": {
                    "value": "B"
                  }
                }
              },
              {
                "terms": {
                  "_type": ["car","pickup"]
                }
              }
            ]
          }
        }
      ]
    }
  }
}

您可以使用特殊字段 _index_type 在索引和类型上进行搜索,所以一旦您知道这一点,只需将布尔查询放在一起即可。

  search("_all").query(
    boolQuery().should(
      boolQuery().must(
        termQuery("_index", "A"),
        termsQuery("_type", "motorbike", "van")
      ),
      boolQuery().must(
        termQuery("_index", "B"),
        termsQuery("_type", "car", "pickup")
      )
    )
  )