ElasticSearch可以处理复杂的Bool查询吗?例如:(A和B)或(C和D)

时间:2017-09-28 11:10:58

标签: elasticsearch

我知道ES搜索必须,应该而且绝对不能 如果我想要A和B.我可以在必须使用两个条件。或者甚至A和B和C ......,我可以将它们全部放在必须中 编辑: 但我不知道如何实施(A和B)或(C和D),剂量ES可以做到吗?

产地: 但我不知道如何实施(A和B)或C,剂量ES可以做到吗?

答案测试:

POST test/test
{
    "name": "I she"
}

以下内容不会搜索任何文章。

POST test/test/_search?pretty
{
    "query": {
          "bool": {
              "should": [
                   {
                     "bool": {
                         "must": [{"match" : { "name" : "I" }}, {"match" : { "name" : "him" }}]
                     }
                 },
                 {
                     "bool": {
                         "must": [{"match" : { "name" : "her" }}, {"match" : { "name" : "she" }}]
                     }
                 }
              ]
          }
      }
}

它将搜索文章

POST test/test/_search?pretty
{
  "query": {
        "bool": {
            "should": [
               {
                   "bool": {
                       "must": [{"match" : { "name" : "I" }}, {"match" : { "name" : "him" }}]
                   }
               },
               {
                   "bool": {
                       "must": {"match" : { "name" : "her" }}
                   }
               }
            ]
        }
    }
}

2 个答案:

答案 0 :(得分:1)

对于复杂的布尔条件,您应该在一个查询中组合必须和应该。例如,如果条件是(A和B)或(C和D),则查询应该类似于

{
    "query": {
        "bool": {
            "should": [
               {
                   "bool": {
                       "must": [A, B]
                   }
               },
               {
                   "bool": {
                       "must": [C, D]
                   }
               }
            ]
        }
    }
}

答案 1 :(得分:1)

你可以这样做。

GET index/type/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
            {
              "term": {
                "field1.keyword": {
                  "value": "A"
                }
              }
            },
            {
              "term": {
                "field2.keyword": {
                  "value": "B"
                }
              }
            }
          ]
          }
        },
        {
          "bool": {
            "must": [
            {
              "term": {
                "field1.keyword": {
                  "value": "C"
                }
              }
            },
            {
              "term": {
                "field2.keyword": {
                  "value": "D"
                }
              }
            }
          ]
          }
        }
      ]
    }
  }
}