具有多个字段和条件的Elasticsearch查询(不过滤)

时间:2016-01-27 11:03:37

标签: sql elasticsearch

我有以下SQL查询:

SELECT * FROM
 table WHERE
 area IN  ('UK', 'US', 'France') 
 AND rating IN ('GOOD', 'BAD','AVG') 
 AND active = 'YES' 

我想将其转换为弹性查询。

请参阅我尝试使用以下"filter"

{
  "query" : {
    "filtered" : {
      "query" : {
        "match_all" : {}
      },
      "filter" : {
        "bool" : {
          "must" : [{
              "terms" : {
                "area" : [
                  "UK",
                  "US",
                  "France"
                ]
              }
            }, 
            {
              "terms" : {
                "rating" : [
                  "GOOD",
                  "BAD",
                  "AVG"
                ]
              }
            }, 
            {
              "term" : {
                "active" : "YES"
              }
            }
          ]
        }
      }
    }
  }
}

然而,这并没有帮助我得分,因为所有这些匹配都在过滤器内。有没有办法将所有这些“必须”匹配移动到“查询”,以便我可以获得得分结果?

我正在寻找一种方法将上面的SQL查询转换为弹性搜索查询,所有条件都在“查询”而不是“过滤器”

非常感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用bool query代替bool filter。您的查询将转换为:

{
 "query": {
  "bool": {
     "must" : [{
          "terms" : {
            "area" : [
              "UK",
              "US",
              "France"
            ]
          }
        }, 
        {
          "terms" : {
            "rating" : [
              "GOOD",
              "BAD",
              "AVG"
            ]
          }
        }, 
        {
          "term" : {
            "active" : "YES"
          }
        }
      ]
    }
   }
  }

现在所有条件都在查询中而不是在filter.Hope中有帮助。

答案 1 :(得分:0)

您已走上正轨,只需在bool/must内移动query数组,即可完全删除filtered查询:

{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "area": [
              "UK",
              "US",
              "France"
            ]
          }
        },
        {
          "terms": {
            "rating": [
              "GOOD",
              "BAD",
              "AVG"
            ]
          }
        },
        {
          "term": {
            "active": "YES"
          }
        }
      ]
    }
  }
}