Bool查询无法按预期工作

时间:2015-11-13 20:45:12

标签: elasticsearch

        POST /test/topic/_search
        {
          "query": {
            "bool": {
              "must": [
                {
                  "multi_match": {
                    "query": "Predisposition",
                    "fields": [
                      "_all"
                    ]
                  }
                },
                {
                  "multi_match": {
                    "query": "thrombosis",
                    "fields": [
                      "_all"
                    ]
                  }
                }
              ],
              "should": [
                {
                  "multi_match": {
                    "query": "cancer",
                    "fields": [
                      "_all"
                    ]
                  }
                }
              ]
            }
          }
        }

我对上述问题的理解是,它必须与predisposition AND thrombosis OR cancer匹配,但我只是得到了少数与predisposition AND thrombosis匹配的文档,我期待很多cancer个文档但是没有。我错过了什么?

2 个答案:

答案 0 :(得分:2)

您正在寻找的方式是,文件必须具有易感性和血栓形成而不管癌症,因为它们在里面必须过滤。 你基本上需要将你的must clause包裹在这里should clause

{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "multi_match": {
                  "query": "predisposition",
                  "fields": "_all"
                }
              },
              {
                "multi_match": {
                  "query": "thrombosis",
                  "fields": "_all"
                }
              }
            ]
          }
        },
        {
          "multi_match": {
            "query": "cancer",
            "fields": "_all"
          }
        }
      ]
    }
  }
}

这将为您提供所需的结果。

答案 1 :(得分:2)

must需要始终匹配。 should只会提高分数如果匹配。

此外,还有另一种情况,即没有must条款,在这种情况下,至少有一个should必须匹配。

我认为您正在寻找以下内容,而不是:

{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "multi_match": {
                  "query": "Predisposition",
                  "fields": [
                    "_all"
                  ]
                }
              },
              {
                "multi_match": {
                  "query": "thrombosis",
                  "fields": [
                    "_all"
                  ]
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "multi_match": {
                  "query": "cancer",
                  "fields": [
                    "_all"
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}