如何在filter(term)查询中添加多个字段以模拟elasticsearch

r7xajy2e  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(1)|浏览(692)

大家好??不确定标题是否足够清楚,所以我将直接跳到我的例子。
我的索引里有一些车,而且都有品牌和型号。我正在做计数查询,我想计算所有的组合。让我们看看下面的查询:

{
    "query": {
        "bool": {
            "filter": [
                {
                    "terms": {
                        "model": [
                            "a5",
                            "a4"
                        ]
                    }
                },
                {
                    "terms": {
                        "make": [
                            "audi",
                            "bmw"
                        ]
                    }
                }
            ]
        }
    }
}

这很管用,但不是我想要的。品牌和型号之间没有关系,但我想有一种关系,因为 a5 以及 a4 只与 audi ,不是 bmw ,这就是我得到错误结果的原因。它应该算上一切 a4 以及 a5 奥迪和所有的宝马,不管他们是哪种型号的,但我只计算奥迪,因为没有 a4 以及 a5 在宝马车里。
理想情况下,我会使用这样的方法:

"filter": [
    {
        "terms": {
            "model": [
                "a5",
                "a4"
            ],
            "make": ["audi"]
        }
    },
    {
        "terms": {
            "make": [
                "bmw"
            ]
        }
    }
]

但由于es错误,这是不可能的: [terms] query does not support multiple fields .
如果你们中的一些人能解决我遇到的问题,我将不胜感激。提前谢谢!

bqujaahr

bqujaahr1#

你需要的是 (make:audi AND model:a4|a5) OR make:bmw 可以重写为 should 一个的 mustterms 和一个独立的 term 查询:

{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "terms": {
                  "model": [
                    "a5",
                    "a4"
                  ]
                }
              },
              {
                "term": {
                  "make": "audi"
                }
              }
            ]
          }
        },
        {
          "term": {
            "make": "bmw"
          }
        }
      ]
    }
  }
}

相关问题