Elasticsearch匹配两个字段

时间:2016-08-24 02:48:33

标签: sql elasticsearch

如何在Elasticsearch上运行这个简单的SQL查询?

SELECT * FROM [mytype] where (id=123 and cid = classroomIdA) or 
(id=234 and cid = classroomIdB) or (id=345 and cid = classroomIdC)

我的语法确实很麻烦,多匹​​配查询在我的情况下不起作用。我应该使用什么类型的查询?

1 个答案:

答案 0 :(得分:0)

正确的方法是将bool/should(对于外部OR条件)和bool/filter(对于内部AND条件)组合在一起。

POST mytype/_search
{
  "query": {
    "bool": {
      "minimum_should_match": 1,
      "should": [
        {
          "bool": {
            "filter": [
              {
                "term": {
                  "id": 123
                }
              },
              {
                "term": {
                  "cid": "classroomIdA"
                }
              }
            ]
          }
        },
        {
          "bool": {
            "filter": [
              {
                "term": {
                  "id": 234
                }
              },
              {
                "term": {
                  "cid": "classroomIdB"
                }
              }
            ]
          }
        },
        {
          "bool": {
            "filter": [
              {
                "term": {
                  "id": 345
                }
              },
              {
                "term": {
                  "cid": "classroomIdC"
                }
              }
            ]
          }
        }
      ]
    }
  }
}

<强>更新

等效的ES 1.7查询(仅bool/filter替换bool/must):

POST mytype/_search
{
  "query": {
    "bool": {
      "minimum_should_match": 1,
      "should": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "id": 123
                }
              },
              {
                "term": {
                  "cid": "classroomIdA"
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "term": {
                  "id": 234
                }
              },
              {
                "term": {
                  "cid": "classroomIdB"
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "term": {
                  "id": 345
                }
              },
              {
                "term": {
                  "cid": "classroomIdC"
                }
              }
            ]
          }
        }
      ]
    }
  }
}